#Set working directory to appropriate folder for inputs and outputs on Google Drive

#Initialize

Load data

rm(list = ls())
library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(Seurat)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
Attaching SeuratObject
Attaching sp
library(ggplot2)
library(RColorBrewer)
library(ggpubr)

`%nin%` = Negate(`%in%`)

#Plot cell cycle

load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/all_data_final_lineages.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Preprocess_GEX/second_timepoint_merged.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Filtering_cDNA/resistant_lineage_lists.RData')

load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/cis_final_lineages.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/cocl2_final_lineages.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/dabtram_final_lineages.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/dabtram_both_times_final_lineages.RData')

Markers within each first drug object to find subgroups (ie analogous to NGFR/EGFR)

need to make Idents metadata object which says if the cells are included in the combined lins list, or if they were filtered

#load('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/all_data_markers.RData')
cis_markers <- FindAllMarkers(cis, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~03s          
  |++                                                | 2 % ~03s          
  |++                                                | 3 % ~03s          
  |+++                                               | 4 % ~03s          
  |+++                                               | 6 % ~03s          
  |++++                                              | 7 % ~03s          
  |++++                                              | 8 % ~03s          
  |+++++                                             | 9 % ~03s          
  |+++++                                             | 10% ~03s          
  |++++++                                            | 11% ~03s          
  |+++++++                                           | 12% ~03s          
  |+++++++                                           | 13% ~03s          
  |++++++++                                          | 14% ~03s          
  |++++++++                                          | 16% ~03s          
  |+++++++++                                         | 17% ~02s          
  |+++++++++                                         | 18% ~02s          
  |++++++++++                                        | 19% ~02s          
  |++++++++++                                        | 20% ~02s          
  |+++++++++++                                       | 21% ~02s          
  |++++++++++++                                      | 22% ~02s          
  |++++++++++++                                      | 23% ~02s          
  |+++++++++++++                                     | 24% ~02s          
  |+++++++++++++                                     | 26% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |++++++++++++++                                    | 28% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |+++++++++++++++                                   | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |+++++++++++++++++                                 | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |++++++++++++++++++++                              | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |++++++++++++++++++++++                            | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |+++++++++++++++++++++++                           | 44% ~02s          
  |+++++++++++++++++++++++                           | 46% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |++++++++++++++++++++++++                          | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |+++++++++++++++++++++++++++                       | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |++++++++++++++++++++++++++++++++++                | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |++                                                | 3 % ~00s          
  |++++                                              | 7 % ~00s          
  |++++++                                            | 10% ~00s          
  |+++++++                                           | 14% ~00s          
  |+++++++++                                         | 17% ~00s          
  |+++++++++++                                       | 21% ~00s          
  |+++++++++++++                                     | 24% ~00s          
  |++++++++++++++                                    | 28% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |++++++++++++++++++                                | 34% ~00s          
  |+++++++++++++++++++                               | 38% ~00s          
  |+++++++++++++++++++++                             | 41% ~00s          
  |+++++++++++++++++++++++                           | 45% ~00s          
  |+++++++++++++++++++++++++                         | 48% ~00s          
  |++++++++++++++++++++++++++                        | 52% ~00s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |++++++++++++++++++++++++++++++++                  | 62% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~05s          
  |++                                                | 2 % ~04s          
  |++                                                | 4 % ~04s          
  |+++                                               | 5 % ~04s          
  |++++                                              | 6 % ~06s          
  |++++                                              | 7 % ~06s          
  |+++++                                             | 8 % ~06s          
  |+++++                                             | 10% ~05s          
  |++++++                                            | 11% ~05s          
  |+++++++                                           | 12% ~05s          
  |+++++++                                           | 13% ~05s          
  |++++++++                                          | 14% ~05s          
  |++++++++                                          | 16% ~04s          
  |+++++++++                                         | 17% ~04s          
  |++++++++++                                        | 18% ~04s          
  |++++++++++                                        | 19% ~04s          
  |+++++++++++                                       | 20% ~04s          
  |+++++++++++                                       | 22% ~04s          
  |++++++++++++                                      | 23% ~04s          
  |+++++++++++++                                     | 24% ~04s          
  |+++++++++++++                                     | 25% ~04s          
  |++++++++++++++                                    | 27% ~04s          
  |++++++++++++++                                    | 28% ~03s          
  |+++++++++++++++                                   | 29% ~03s          
  |++++++++++++++++                                  | 30% ~03s          
  |++++++++++++++++                                  | 31% ~03s          
  |+++++++++++++++++                                 | 33% ~03s          
  |+++++++++++++++++                                 | 34% ~03s          
  |++++++++++++++++++                                | 35% ~03s          
  |+++++++++++++++++++                               | 36% ~03s          
  |+++++++++++++++++++                               | 37% ~03s          
  |++++++++++++++++++++                              | 39% ~03s          
  |++++++++++++++++++++                              | 40% ~03s          
  |+++++++++++++++++++++                             | 41% ~03s          
  |++++++++++++++++++++++                            | 42% ~03s          
  |++++++++++++++++++++++                            | 43% ~03s          
  |+++++++++++++++++++++++                           | 45% ~03s          
  |+++++++++++++++++++++++                           | 46% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |+++++++++++++++++++++++++                         | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |++++++++++++++++++++++++++                        | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |++++++++++++++++++++++++++++                      | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |+++++++++++++++++++++++++++++                     | 58% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |+++++++++++++++++++++++++++++++                   | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |++++++++++++++++++++++++++++++++                  | 63% ~02s          
  |++++++++++++++++++++++++++++++++                  | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |++++++++++++++++++++++++++++++++++                | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04s  
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~03s          
  |++                                                | 3 % ~03s          
  |++                                                | 4 % ~03s          
  |+++                                               | 5 % ~03s          
  |++++                                              | 7 % ~02s          
  |++++                                              | 8 % ~02s          
  |+++++                                             | 9 % ~02s          
  |++++++                                            | 11% ~02s          
  |++++++                                            | 12% ~02s          
  |+++++++                                           | 13% ~02s          
  |++++++++                                          | 14% ~02s          
  |++++++++                                          | 16% ~02s          
  |+++++++++                                         | 17% ~02s          
  |++++++++++                                        | 18% ~02s          
  |++++++++++                                        | 20% ~02s          
  |+++++++++++                                       | 21% ~02s          
  |++++++++++++                                      | 22% ~02s          
  |++++++++++++                                      | 24% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |++++++++++++++                                    | 26% ~02s          
  |++++++++++++++                                    | 28% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |++++++++++++++++                                  | 30% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |++++++++++++++++++++                              | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |++++++++++++++++++++++                            | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |++++++++++++++++++++++++                          | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 4

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~04s          
  |++                                                | 2 % ~04s          
  |++                                                | 3 % ~04s          
  |+++                                               | 5 % ~04s          
  |+++                                               | 6 % ~04s          
  |++++                                              | 7 % ~04s          
  |+++++                                             | 8 % ~03s          
  |+++++                                             | 9 % ~04s          
  |++++++                                            | 10% ~03s          
  |++++++                                            | 12% ~03s          
  |+++++++                                           | 13% ~03s          
  |+++++++                                           | 14% ~03s          
  |++++++++                                          | 15% ~03s          
  |+++++++++                                         | 16% ~03s          
  |+++++++++                                         | 17% ~03s          
  |++++++++++                                        | 19% ~03s          
  |++++++++++                                        | 20% ~03s          
  |+++++++++++                                       | 21% ~03s          
  |++++++++++++                                      | 22% ~03s          
  |++++++++++++                                      | 23% ~03s          
  |+++++++++++++                                     | 24% ~03s          
  |+++++++++++++                                     | 26% ~03s          
  |++++++++++++++                                    | 27% ~03s          
  |++++++++++++++                                    | 28% ~03s          
  |+++++++++++++++                                   | 29% ~03s          
  |++++++++++++++++                                  | 30% ~03s          
  |++++++++++++++++                                  | 31% ~03s          
  |+++++++++++++++++                                 | 33% ~03s          
  |+++++++++++++++++                                 | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |+++++++++++++++++++                               | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |++++++++++++++++++++                              | 38% ~02s          
  |++++++++++++++++++++                              | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |+++++++++++++++++++++                             | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |+++++++++++++++++++++++                           | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |++++++++++++++++++++++++                          | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |+++++++++++++++++++++++++                         | 50% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |+++++++++++++++++++++++++++                       | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |++++++++++++++++++++++++++++                      | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |++++++++++++++++++++++++++++++                    | 58% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |++++++++++++++++++++++++++++++++++                | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04s  
Calculating cluster 5

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~07s          
  |++                                                | 2 % ~07s          
  |++                                                | 3 % ~07s          
  |+++                                               | 5 % ~06s          
  |+++                                               | 6 % ~06s          
  |++++                                              | 7 % ~06s          
  |+++++                                             | 8 % ~06s          
  |+++++                                             | 9 % ~06s          
  |++++++                                            | 10% ~06s          
  |++++++                                            | 12% ~06s          
  |+++++++                                           | 13% ~06s          
  |+++++++                                           | 14% ~06s          
  |++++++++                                          | 15% ~05s          
  |+++++++++                                         | 16% ~05s          
  |+++++++++                                         | 17% ~05s          
  |++++++++++                                        | 19% ~05s          
  |++++++++++                                        | 20% ~05s          
  |+++++++++++                                       | 21% ~05s          
  |++++++++++++                                      | 22% ~05s          
  |++++++++++++                                      | 23% ~05s          
  |+++++++++++++                                     | 24% ~05s          
  |+++++++++++++                                     | 26% ~05s          
  |++++++++++++++                                    | 27% ~05s          
  |++++++++++++++                                    | 28% ~05s          
  |+++++++++++++++                                   | 29% ~05s          
  |++++++++++++++++                                  | 30% ~04s          
  |++++++++++++++++                                  | 31% ~04s          
  |+++++++++++++++++                                 | 33% ~04s          
  |+++++++++++++++++                                 | 34% ~04s          
  |++++++++++++++++++                                | 35% ~04s          
  |+++++++++++++++++++                               | 36% ~04s          
  |+++++++++++++++++++                               | 37% ~04s          
  |++++++++++++++++++++                              | 38% ~04s          
  |++++++++++++++++++++                              | 40% ~04s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |+++++++++++++++++++++                             | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |+++++++++++++++++++++++                           | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |++++++++++++++++++++++++                          | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |+++++++++++++++++++++++++                         | 50% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~03s          
  |+++++++++++++++++++++++++++                       | 52% ~03s          
  |+++++++++++++++++++++++++++                       | 53% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |++++++++++++++++++++++++++++++                    | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |+++++++++++++++++++++++++++++++                   | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~02s          
  |++++++++++++++++++++++++++++++++                  | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |++++++++++++++++++++++++++++++++++                | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=06s  
Calculating cluster 6

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~03s          
  |++                                                | 2 % ~03s          
  |++                                                | 3 % ~03s          
  |+++                                               | 5 % ~03s          
  |+++                                               | 6 % ~03s          
  |++++                                              | 7 % ~03s          
  |++++                                              | 8 % ~03s          
  |+++++                                             | 9 % ~02s          
  |++++++                                            | 10% ~02s          
  |++++++                                            | 11% ~02s          
  |+++++++                                           | 12% ~02s          
  |+++++++                                           | 14% ~02s          
  |++++++++                                          | 15% ~02s          
  |++++++++                                          | 16% ~02s          
  |+++++++++                                         | 17% ~02s          
  |++++++++++                                        | 18% ~02s          
  |++++++++++                                        | 19% ~02s          
  |+++++++++++                                       | 20% ~02s          
  |+++++++++++                                       | 22% ~02s          
  |++++++++++++                                      | 23% ~02s          
  |++++++++++++                                      | 24% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |++++++++++++++                                    | 26% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |+++++++++++++++                                   | 28% ~02s          
  |+++++++++++++++                                   | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |+++++++++++++++++++                               | 36% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |++++++++++++++++++++                              | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |++++++++++++++++++++++                            | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |+++++++++++++++++++++++                           | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |++++++++++++++++++++++++                          | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |+++++++++++++++++++++++++++                       | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 7

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~03s          
  |++                                                | 2 % ~03s          
  |++                                                | 3 % ~03s          
  |+++                                               | 4 % ~03s          
  |+++                                               | 5 % ~03s          
  |++++                                              | 7 % ~02s          
  |++++                                              | 8 % ~02s          
  |+++++                                             | 9 % ~02s          
  |+++++                                             | 10% ~02s          
  |++++++                                            | 11% ~02s          
  |+++++++                                           | 12% ~02s          
  |+++++++                                           | 13% ~02s          
  |++++++++                                          | 14% ~02s          
  |++++++++                                          | 15% ~02s          
  |+++++++++                                         | 16% ~02s          
  |+++++++++                                         | 18% ~02s          
  |++++++++++                                        | 19% ~02s          
  |++++++++++                                        | 20% ~02s          
  |+++++++++++                                       | 21% ~02s          
  |+++++++++++                                       | 22% ~02s          
  |++++++++++++                                      | 23% ~02s          
  |+++++++++++++                                     | 24% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |++++++++++++++                                    | 26% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |+++++++++++++++                                   | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |+++++++++++++++++++                               | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |++++++++++++++++++++                              | 38% ~02s          
  |++++++++++++++++++++                              | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |+++++++++++++++++++++                             | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |++++++++++++++++++++++                            | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |++++++++++++++++++++++++                          | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 8

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~05s          
  |++                                                | 2 % ~05s          
  |++                                                | 3 % ~05s          
  |+++                                               | 4 % ~05s          
  |+++                                               | 5 % ~05s          
  |++++                                              | 6 % ~05s          
  |++++                                              | 7 % ~05s          
  |+++++                                             | 8 % ~05s          
  |+++++                                             | 9 % ~04s          
  |++++++                                            | 11% ~04s          
  |++++++                                            | 12% ~04s          
  |+++++++                                           | 13% ~04s          
  |+++++++                                           | 14% ~04s          
  |++++++++                                          | 15% ~04s          
  |++++++++                                          | 16% ~04s          
  |+++++++++                                         | 17% ~04s          
  |+++++++++                                         | 18% ~04s          
  |++++++++++                                        | 19% ~04s          
  |++++++++++                                        | 20% ~04s          
  |+++++++++++                                       | 21% ~04s          
  |++++++++++++                                      | 22% ~04s          
  |++++++++++++                                      | 23% ~04s          
  |+++++++++++++                                     | 24% ~04s          
  |+++++++++++++                                     | 25% ~04s          
  |++++++++++++++                                    | 26% ~04s          
  |++++++++++++++                                    | 27% ~04s          
  |+++++++++++++++                                   | 28% ~03s          
  |+++++++++++++++                                   | 29% ~03s          
  |++++++++++++++++                                  | 31% ~03s          
  |++++++++++++++++                                  | 32% ~03s          
  |+++++++++++++++++                                 | 33% ~03s          
  |+++++++++++++++++                                 | 34% ~03s          
  |++++++++++++++++++                                | 35% ~03s          
  |++++++++++++++++++                                | 36% ~03s          
  |+++++++++++++++++++                               | 37% ~03s          
  |+++++++++++++++++++                               | 38% ~03s          
  |++++++++++++++++++++                              | 39% ~03s          
  |++++++++++++++++++++                              | 40% ~03s          
  |+++++++++++++++++++++                             | 41% ~03s          
  |++++++++++++++++++++++                            | 42% ~03s          
  |++++++++++++++++++++++                            | 43% ~03s          
  |+++++++++++++++++++++++                           | 44% ~03s          
  |+++++++++++++++++++++++                           | 45% ~03s          
  |++++++++++++++++++++++++                          | 46% ~03s          
  |++++++++++++++++++++++++                          | 47% ~03s          
  |+++++++++++++++++++++++++                         | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |++++++++++++++++++++++++++                        | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |+++++++++++++++++++++++++++                       | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |++++++++++++++++++++++++++++                      | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |+++++++++++++++++++++++++++++                     | 58% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |++++++++++++++++++++++++++++++                    | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |++++++++++++++++++++++++++++++++                  | 62% ~02s          
  |++++++++++++++++++++++++++++++++                  | 63% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |++++++++++++++++++++++++++++++++++                | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=05s  
cocl2_markers <- FindAllMarkers(cocl2, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~03s          
  |++                                                | 2 % ~03s          
  |++                                                | 3 % ~03s          
  |+++                                               | 4 % ~03s          
  |+++                                               | 5 % ~03s          
  |++++                                              | 6 % ~03s          
  |++++                                              | 7 % ~03s          
  |+++++                                             | 9 % ~03s          
  |+++++                                             | 10% ~03s          
  |++++++                                            | 11% ~03s          
  |++++++                                            | 12% ~03s          
  |+++++++                                           | 13% ~03s          
  |+++++++                                           | 14% ~03s          
  |++++++++                                          | 15% ~03s          
  |++++++++                                          | 16% ~03s          
  |+++++++++                                         | 17% ~03s          
  |++++++++++                                        | 18% ~03s          
  |++++++++++                                        | 19% ~03s          
  |+++++++++++                                       | 20% ~03s          
  |+++++++++++                                       | 21% ~03s          
  |++++++++++++                                      | 22% ~03s          
  |++++++++++++                                      | 23% ~03s          
  |+++++++++++++                                     | 24% ~03s          
  |+++++++++++++                                     | 26% ~03s          
  |++++++++++++++                                    | 27% ~03s          
  |++++++++++++++                                    | 28% ~03s          
  |+++++++++++++++                                   | 29% ~03s          
  |+++++++++++++++                                   | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |+++++++++++++++++++                               | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |++++++++++++++++++++                              | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |+++++++++++++++++++++                             | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |++++++++++++++++++++++                            | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |+++++++++++++++++++++++                           | 46% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |++++++++++++++++++++++++                          | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |+++++++++++++++++++++++++                         | 50% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |+++++++++++++++++++++++++++                       | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |++++++++++++++++++++++++++++                      | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |+++++++++++++++++++++++++++++                     | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02s          
  |++                                                | 2 % ~01s          
  |++                                                | 4 % ~01s          
  |+++                                               | 5 % ~01s          
  |++++                                              | 6 % ~01s          
  |++++                                              | 8 % ~01s          
  |+++++                                             | 9 % ~01s          
  |+++++                                             | 10% ~01s          
  |++++++                                            | 11% ~01s          
  |+++++++                                           | 12% ~01s          
  |+++++++                                           | 14% ~01s          
  |++++++++                                          | 15% ~01s          
  |+++++++++                                         | 16% ~01s          
  |+++++++++                                         | 18% ~01s          
  |++++++++++                                        | 19% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |++++++++++++                                      | 22% ~01s          
  |++++++++++++                                      | 24% ~01s          
  |+++++++++++++                                     | 25% ~01s          
  |++++++++++++++                                    | 26% ~01s          
  |++++++++++++++                                    | 28% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |+++++++++++++++++                                 | 32% ~01s          
  |+++++++++++++++++                                 | 34% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |+++++++++++++++++++                               | 36% ~01s          
  |+++++++++++++++++++                               | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |++++++++++++++++++++++                            | 42% ~01s          
  |++++++++++++++++++++++                            | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |++++++++++++++++++++++++                          | 46% ~01s          
  |++++++++++++++++++++++++                          | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |+++++++++++++++++++++++++++                       | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |++++++++++++++++++++++++++++++++                  | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |++++++++++++++++++++++++++++++++++                | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02s          
  |++                                                | 3 % ~02s          
  |++                                                | 4 % ~02s          
  |+++                                               | 5 % ~02s          
  |++++                                              | 7 % ~02s          
  |++++                                              | 8 % ~02s          
  |+++++                                             | 9 % ~02s          
  |++++++                                            | 11% ~02s          
  |++++++                                            | 12% ~02s          
  |+++++++                                           | 13% ~02s          
  |++++++++                                          | 14% ~02s          
  |++++++++                                          | 16% ~01s          
  |+++++++++                                         | 17% ~01s          
  |++++++++++                                        | 18% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |++++++++++++                                      | 22% ~01s          
  |++++++++++++                                      | 24% ~01s          
  |+++++++++++++                                     | 25% ~01s          
  |++++++++++++++                                    | 26% ~01s          
  |++++++++++++++                                    | 28% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |++++++++++++++++                                  | 30% ~01s          
  |++++++++++++++++                                  | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |++++++++++++++++++                                | 34% ~01s          
  |++++++++++++++++++                                | 36% ~01s          
  |+++++++++++++++++++                               | 37% ~01s          
  |++++++++++++++++++++                              | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |++++++++++++++++++++++                            | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |++++++++++++++++++++++++                          | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~04s          
  |++                                                | 2 % ~04s          
  |++                                                | 3 % ~04s          
  |+++                                               | 4 % ~04s          
  |+++                                               | 5 % ~04s          
  |++++                                              | 7 % ~04s          
  |++++                                              | 8 % ~04s          
  |+++++                                             | 9 % ~04s          
  |+++++                                             | 10% ~04s          
  |++++++                                            | 11% ~04s          
  |+++++++                                           | 12% ~03s          
  |+++++++                                           | 13% ~03s          
  |++++++++                                          | 14% ~03s          
  |++++++++                                          | 15% ~03s          
  |+++++++++                                         | 16% ~03s          
  |+++++++++                                         | 18% ~03s          
  |++++++++++                                        | 19% ~03s          
  |++++++++++                                        | 20% ~03s          
  |+++++++++++                                       | 21% ~03s          
  |+++++++++++                                       | 22% ~03s          
  |++++++++++++                                      | 23% ~03s          
  |+++++++++++++                                     | 24% ~03s          
  |+++++++++++++                                     | 25% ~03s          
  |++++++++++++++                                    | 26% ~03s          
  |++++++++++++++                                    | 27% ~03s          
  |+++++++++++++++                                   | 29% ~03s          
  |+++++++++++++++                                   | 30% ~03s          
  |++++++++++++++++                                  | 31% ~03s          
  |++++++++++++++++                                  | 32% ~03s          
  |+++++++++++++++++                                 | 33% ~03s          
  |++++++++++++++++++                                | 34% ~03s          
  |++++++++++++++++++                                | 35% ~03s          
  |+++++++++++++++++++                               | 36% ~03s          
  |+++++++++++++++++++                               | 37% ~03s          
  |++++++++++++++++++++                              | 38% ~03s          
  |++++++++++++++++++++                              | 40% ~03s          
  |+++++++++++++++++++++                             | 41% ~03s          
  |+++++++++++++++++++++                             | 42% ~03s          
  |++++++++++++++++++++++                            | 43% ~03s          
  |++++++++++++++++++++++                            | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |++++++++++++++++++++++++                          | 46% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |+++++++++++++++++++++++++                         | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |++++++++++++++++++++++++++                        | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |+++++++++++++++++++++++++++                       | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |+++++++++++++++++++++++++++++                     | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |++++++++++++++++++++++++++++++                    | 58% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |+++++++++++++++++++++++++++++++                   | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 62% ~02s          
  |++++++++++++++++++++++++++++++++                  | 63% ~02s          
  |++++++++++++++++++++++++++++++++                  | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04s  
Calculating cluster 4

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~03s          
  |+                                                 | 2 % ~03s          
  |++                                                | 3 % ~03s          
  |++                                                | 4 % ~03s          
  |+++                                               | 5 % ~03s          
  |+++                                               | 6 % ~03s          
  |++++                                              | 7 % ~02s          
  |++++                                              | 8 % ~02s          
  |+++++                                             | 9 % ~02s          
  |+++++                                             | 10% ~02s          
  |++++++                                            | 11% ~02s          
  |++++++                                            | 12% ~02s          
  |+++++++                                           | 13% ~02s          
  |+++++++                                           | 14% ~02s          
  |++++++++                                          | 15% ~02s          
  |++++++++                                          | 16% ~02s          
  |+++++++++                                         | 17% ~02s          
  |+++++++++                                         | 18% ~02s          
  |++++++++++                                        | 19% ~02s          
  |++++++++++                                        | 20% ~02s          
  |+++++++++++                                       | 21% ~02s          
  |+++++++++++                                       | 22% ~02s          
  |++++++++++++                                      | 23% ~02s          
  |++++++++++++                                      | 24% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |+++++++++++++                                     | 26% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |++++++++++++++                                    | 28% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |+++++++++++++++                                   | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |+++++++++++++++++                                 | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |++++++++++++++++++                                | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |++++++++++++++++++++                              | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |+++++++++++++++++++++                             | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |++++++++++++++++++++++                            | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |+++++++++++++++++++++++                           | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |++++++++++++++++++++++++                          | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |++++++++++++++++++++++++++++++++++                | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 5

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02s          
  |++                                                | 3 % ~02s          
  |++                                                | 4 % ~02s          
  |+++                                               | 5 % ~02s          
  |++++                                              | 6 % ~02s          
  |++++                                              | 8 % ~02s          
  |+++++                                             | 9 % ~02s          
  |++++++                                            | 10% ~02s          
  |++++++                                            | 11% ~02s          
  |+++++++                                           | 13% ~02s          
  |+++++++                                           | 14% ~02s          
  |++++++++                                          | 15% ~02s          
  |+++++++++                                         | 16% ~02s          
  |+++++++++                                         | 18% ~02s          
  |++++++++++                                        | 19% ~02s          
  |+++++++++++                                       | 20% ~02s          
  |+++++++++++                                       | 22% ~02s          
  |++++++++++++                                      | 23% ~02s          
  |+++++++++++++                                     | 24% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |++++++++++++++                                    | 28% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |++++++++++++++++                                  | 30% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |+++++++++++++++++++++                             | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |+++++++++++++++++++++++                           | 44% ~01s          
  |+++++++++++++++++++++++                           | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 6

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02s          
  |++                                                | 2 % ~02s          
  |++                                                | 3 % ~02s          
  |+++                                               | 4 % ~02s          
  |+++                                               | 5 % ~02s          
  |++++                                              | 6 % ~02s          
  |++++                                              | 7 % ~02s          
  |+++++                                             | 9 % ~02s          
  |+++++                                             | 10% ~02s          
  |++++++                                            | 11% ~02s          
  |++++++                                            | 12% ~02s          
  |+++++++                                           | 13% ~02s          
  |+++++++                                           | 14% ~02s          
  |++++++++                                          | 15% ~02s          
  |++++++++                                          | 16% ~02s          
  |+++++++++                                         | 17% ~02s          
  |++++++++++                                        | 18% ~02s          
  |++++++++++                                        | 19% ~02s          
  |+++++++++++                                       | 20% ~02s          
  |+++++++++++                                       | 21% ~01s          
  |++++++++++++                                      | 22% ~01s          
  |++++++++++++                                      | 23% ~01s          
  |+++++++++++++                                     | 24% ~01s          
  |+++++++++++++                                     | 26% ~01s          
  |++++++++++++++                                    | 27% ~01s          
  |++++++++++++++                                    | 28% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |++++++++++++++++                                  | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |++++++++++++++++++                                | 34% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |+++++++++++++++++++                               | 36% ~01s          
  |+++++++++++++++++++                               | 37% ~01s          
  |++++++++++++++++++++                              | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |+++++++++++++++++++++                             | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |++++++++++++++++++++++                            | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |+++++++++++++++++++++++                           | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |++++++++++++++++++++++++                          | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |+++++++++++++++++++++++++++                       | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
Calculating cluster 7

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~11s          
  |+                                                 | 2 % ~11s          
  |++                                                | 3 % ~11s          
  |++                                                | 4 % ~11s          
  |+++                                               | 5 % ~11s          
  |+++                                               | 6 % ~11s          
  |++++                                              | 7 % ~11s          
  |++++                                              | 8 % ~10s          
  |+++++                                             | 9 % ~10s          
  |+++++                                             | 10% ~10s          
  |++++++                                            | 11% ~10s          
  |++++++                                            | 12% ~10s          
  |+++++++                                           | 13% ~10s          
  |+++++++                                           | 14% ~10s          
  |++++++++                                          | 15% ~10s          
  |++++++++                                          | 16% ~10s          
  |+++++++++                                         | 17% ~10s          
  |+++++++++                                         | 18% ~10s          
  |++++++++++                                        | 19% ~09s          
  |++++++++++                                        | 20% ~09s          
  |+++++++++++                                       | 21% ~09s          
  |+++++++++++                                       | 22% ~09s          
  |++++++++++++                                      | 23% ~09s          
  |++++++++++++                                      | 24% ~09s          
  |+++++++++++++                                     | 25% ~09s          
  |+++++++++++++                                     | 26% ~09s          
  |++++++++++++++                                    | 27% ~08s          
  |++++++++++++++                                    | 28% ~08s          
  |+++++++++++++++                                   | 29% ~08s          
  |+++++++++++++++                                   | 30% ~08s          
  |++++++++++++++++                                  | 31% ~08s          
  |++++++++++++++++                                  | 32% ~08s          
  |+++++++++++++++++                                 | 33% ~08s          
  |+++++++++++++++++                                 | 34% ~08s          
  |++++++++++++++++++                                | 35% ~08s          
  |++++++++++++++++++                                | 36% ~07s          
  |+++++++++++++++++++                               | 37% ~07s          
  |+++++++++++++++++++                               | 38% ~07s          
  |++++++++++++++++++++                              | 39% ~07s          
  |++++++++++++++++++++                              | 40% ~07s          
  |+++++++++++++++++++++                             | 41% ~07s          
  |+++++++++++++++++++++                             | 42% ~07s          
  |++++++++++++++++++++++                            | 43% ~07s          
  |++++++++++++++++++++++                            | 44% ~06s          
  |+++++++++++++++++++++++                           | 45% ~06s          
  |+++++++++++++++++++++++                           | 46% ~06s          
  |++++++++++++++++++++++++                          | 47% ~06s          
  |++++++++++++++++++++++++                          | 48% ~06s          
  |+++++++++++++++++++++++++                         | 49% ~06s          
  |+++++++++++++++++++++++++                         | 50% ~06s          
  |++++++++++++++++++++++++++                        | 51% ~06s          
  |++++++++++++++++++++++++++                        | 52% ~06s          
  |+++++++++++++++++++++++++++                       | 53% ~05s          
  |+++++++++++++++++++++++++++                       | 54% ~05s          
  |++++++++++++++++++++++++++++                      | 55% ~05s          
  |++++++++++++++++++++++++++++                      | 56% ~05s          
  |+++++++++++++++++++++++++++++                     | 57% ~05s          
  |+++++++++++++++++++++++++++++                     | 58% ~05s          
  |++++++++++++++++++++++++++++++                    | 59% ~05s          
  |++++++++++++++++++++++++++++++                    | 60% ~05s          
  |+++++++++++++++++++++++++++++++                   | 61% ~05s          
  |+++++++++++++++++++++++++++++++                   | 62% ~04s          
  |++++++++++++++++++++++++++++++++                  | 63% ~04s          
  |++++++++++++++++++++++++++++++++                  | 64% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~04s          
  |++++++++++++++++++++++++++++++++++                | 67% ~04s          
  |++++++++++++++++++++++++++++++++++                | 68% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=12s  
Calculating cluster 8

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~04s          
  |++                                                | 2 % ~04s          
  |++                                                | 3 % ~04s          
  |+++                                               | 5 % ~04s          
  |+++                                               | 6 % ~04s          
  |++++                                              | 7 % ~04s          
  |+++++                                             | 8 % ~04s          
  |+++++                                             | 9 % ~04s          
  |++++++                                            | 10% ~04s          
  |++++++                                            | 11% ~03s          
  |+++++++                                           | 13% ~03s          
  |+++++++                                           | 14% ~03s          
  |++++++++                                          | 15% ~03s          
  |+++++++++                                         | 16% ~03s          
  |+++++++++                                         | 17% ~03s          
  |++++++++++                                        | 18% ~03s          
  |++++++++++                                        | 20% ~03s          
  |+++++++++++                                       | 21% ~03s          
  |+++++++++++                                       | 22% ~03s          
  |++++++++++++                                      | 23% ~03s          
  |+++++++++++++                                     | 24% ~03s          
  |+++++++++++++                                     | 25% ~03s          
  |++++++++++++++                                    | 26% ~03s          
  |++++++++++++++                                    | 28% ~03s          
  |+++++++++++++++                                   | 29% ~03s          
  |+++++++++++++++                                   | 30% ~03s          
  |++++++++++++++++                                  | 31% ~03s          
  |+++++++++++++++++                                 | 32% ~03s          
  |+++++++++++++++++                                 | 33% ~03s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |+++++++++++++++++++++                             | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |++++++++++++++++++++++                            | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |+++++++++++++++++++++++                           | 46% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |+++++++++++++++++++++++++                         | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |++++++++++++++++++++++++++                        | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |++++++++++++++++++++++++++++                      | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |+++++++++++++++++++++++++++++                     | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |++++++++++++++++++++++++++++++                    | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |++++++++++++++++++++++++++++++++                  | 62% ~02s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |++++++++++++++++++++++++++++++++++                | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04s  
Calculating cluster 9

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~08s          
  |++                                                | 2 % ~08s          
  |++                                                | 3 % ~08s          
  |+++                                               | 4 % ~08s          
  |+++                                               | 5 % ~07s          
  |++++                                              | 6 % ~07s          
  |++++                                              | 7 % ~07s          
  |+++++                                             | 8 % ~07s          
  |+++++                                             | 9 % ~07s          
  |++++++                                            | 10% ~07s          
  |++++++                                            | 11% ~07s          
  |+++++++                                           | 12% ~07s          
  |+++++++                                           | 13% ~07s          
  |++++++++                                          | 14% ~07s          
  |++++++++                                          | 15% ~07s          
  |+++++++++                                         | 16% ~06s          
  |+++++++++                                         | 17% ~06s          
  |++++++++++                                        | 18% ~06s          
  |++++++++++                                        | 19% ~06s          
  |+++++++++++                                       | 20% ~06s          
  |+++++++++++                                       | 21% ~06s          
  |++++++++++++                                      | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |+++++++++++++                                     | 24% ~06s          
  |+++++++++++++                                     | 25% ~06s          
  |++++++++++++++                                    | 26% ~06s          
  |++++++++++++++                                    | 27% ~06s          
  |+++++++++++++++                                   | 28% ~06s          
  |+++++++++++++++                                   | 29% ~05s          
  |++++++++++++++++                                  | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |+++++++++++++++++                                 | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |++++++++++++++++++                                | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |+++++++++++++++++++                               | 36% ~05s          
  |+++++++++++++++++++                               | 37% ~05s          
  |++++++++++++++++++++                              | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |+++++++++++++++++++++                             | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |++++++++++++++++++++++                            | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |+++++++++++++++++++++++                           | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |++++++++++++++++++++++++                          | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |+++++++++++++++++++++++++                         | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |++++++++++++++++++++++++++++++                    | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |++++++++++++++++++++++++++++++++++                | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s  
dabtram_markers <- FindAllMarkers(dabtram, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~04s          
  |++                                                | 2 % ~04s          
  |++                                                | 3 % ~03s          
  |+++                                               | 5 % ~03s          
  |+++                                               | 6 % ~03s          
  |++++                                              | 7 % ~03s          
  |++++                                              | 8 % ~03s          
  |+++++                                             | 9 % ~03s          
  |++++++                                            | 10% ~03s          
  |++++++                                            | 11% ~03s          
  |+++++++                                           | 12% ~03s          
  |+++++++                                           | 14% ~03s          
  |++++++++                                          | 15% ~03s          
  |++++++++                                          | 16% ~03s          
  |+++++++++                                         | 17% ~03s          
  |++++++++++                                        | 18% ~03s          
  |++++++++++                                        | 19% ~03s          
  |+++++++++++                                       | 20% ~03s          
  |+++++++++++                                       | 22% ~03s          
  |++++++++++++                                      | 23% ~02s          
  |++++++++++++                                      | 24% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |++++++++++++++                                    | 26% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |+++++++++++++++                                   | 28% ~02s          
  |+++++++++++++++                                   | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |+++++++++++++++++++                               | 36% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |++++++++++++++++++++                              | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |++++++++++++++++++++++                            | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |+++++++++++++++++++++++                           | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |++++++++++++++++++++++++                          | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |+++++++++++++++++++++++++                         | 50% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |+++++++++++++++++++++++++++                       | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |++++++++++++++++++++++++++++                      | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~04s          
  |++                                                | 2 % ~04s          
  |++                                                | 3 % ~04s          
  |+++                                               | 4 % ~03s          
  |+++                                               | 5 % ~03s          
  |++++                                              | 6 % ~03s          
  |++++                                              | 7 % ~03s          
  |+++++                                             | 8 % ~03s          
  |+++++                                             | 9 % ~03s          
  |++++++                                            | 10% ~03s          
  |++++++                                            | 11% ~03s          
  |+++++++                                           | 12% ~03s          
  |+++++++                                           | 13% ~03s          
  |++++++++                                          | 14% ~03s          
  |++++++++                                          | 15% ~03s          
  |+++++++++                                         | 16% ~03s          
  |+++++++++                                         | 17% ~03s          
  |++++++++++                                        | 18% ~03s          
  |++++++++++                                        | 19% ~03s          
  |+++++++++++                                       | 20% ~03s          
  |+++++++++++                                       | 21% ~03s          
  |++++++++++++                                      | 22% ~03s          
  |++++++++++++                                      | 23% ~03s          
  |+++++++++++++                                     | 24% ~03s          
  |+++++++++++++                                     | 26% ~03s          
  |++++++++++++++                                    | 27% ~03s          
  |++++++++++++++                                    | 28% ~03s          
  |+++++++++++++++                                   | 29% ~02s          
  |+++++++++++++++                                   | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |+++++++++++++++++                                 | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |++++++++++++++++++                                | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |++++++++++++++++++++                              | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |+++++++++++++++++++++                             | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |++++++++++++++++++++++                            | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |+++++++++++++++++++++++                           | 46% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |++++++++++++++++++++++++                          | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |+++++++++++++++++++++++++                         | 50% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |+++++++++++++++++++++++++++                       | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |++++++++++++++++++++++++++++                      | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |+++++++++++++++++++++++++++++                     | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |++++++++++++++++++++++++++++++++++                | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~04s          
  |++                                                | 2 % ~04s          
  |++                                                | 3 % ~04s          
  |+++                                               | 5 % ~03s          
  |+++                                               | 6 % ~03s          
  |++++                                              | 7 % ~03s          
  |+++++                                             | 8 % ~03s          
  |+++++                                             | 9 % ~03s          
  |++++++                                            | 10% ~03s          
  |++++++                                            | 11% ~03s          
  |+++++++                                           | 13% ~03s          
  |+++++++                                           | 14% ~03s          
  |++++++++                                          | 15% ~03s          
  |+++++++++                                         | 16% ~03s          
  |+++++++++                                         | 17% ~03s          
  |++++++++++                                        | 18% ~03s          
  |++++++++++                                        | 20% ~03s          
  |+++++++++++                                       | 21% ~03s          
  |+++++++++++                                       | 22% ~03s          
  |++++++++++++                                      | 23% ~03s          
  |+++++++++++++                                     | 24% ~03s          
  |+++++++++++++                                     | 25% ~03s          
  |++++++++++++++                                    | 26% ~03s          
  |++++++++++++++                                    | 28% ~03s          
  |+++++++++++++++                                   | 29% ~03s          
  |+++++++++++++++                                   | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |+++++++++++++++++                                 | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |+++++++++++++++++++++                             | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |++++++++++++++++++++++                            | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |+++++++++++++++++++++++                           | 46% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |+++++++++++++++++++++++++                         | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |++++++++++++++++++++++++++                        | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |++++++++++++++++++++++++++++                      | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |+++++++++++++++++++++++++++++                     | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |++++++++++++++++++++++++++++++++++                | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04s  
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~03s          
  |++                                                | 2 % ~02s          
  |++                                                | 4 % ~02s          
  |+++                                               | 5 % ~02s          
  |++++                                              | 6 % ~02s          
  |++++                                              | 7 % ~02s          
  |+++++                                             | 9 % ~02s          
  |+++++                                             | 10% ~02s          
  |++++++                                            | 11% ~02s          
  |+++++++                                           | 12% ~02s          
  |+++++++                                           | 14% ~02s          
  |++++++++                                          | 15% ~02s          
  |+++++++++                                         | 16% ~02s          
  |+++++++++                                         | 17% ~02s          
  |++++++++++                                        | 19% ~02s          
  |++++++++++                                        | 20% ~02s          
  |+++++++++++                                       | 21% ~02s          
  |++++++++++++                                      | 22% ~02s          
  |++++++++++++                                      | 23% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |+++++++++++++                                     | 26% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |+++++++++++++++                                   | 28% ~02s          
  |+++++++++++++++                                   | 30% ~02s          
  |++++++++++++++++                                  | 31% ~01s          
  |+++++++++++++++++                                 | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |++++++++++++++++++                                | 36% ~01s          
  |+++++++++++++++++++                               | 37% ~01s          
  |++++++++++++++++++++                              | 38% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |+++++++++++++++++++++                             | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |+++++++++++++++++++++++                           | 44% ~01s          
  |+++++++++++++++++++++++                           | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |++++++++++++++++++++++++++++++++++                | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
Calculating cluster 4

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~08s          
  |++                                                | 2 % ~08s          
  |++                                                | 3 % ~07s          
  |+++                                               | 4 % ~10s          
  |+++                                               | 5 % ~09s          
  |++++                                              | 6 % ~09s          
  |++++                                              | 7 % ~09s          
  |+++++                                             | 8 % ~08s          
  |+++++                                             | 9 % ~08s          
  |++++++                                            | 10% ~08s          
  |++++++                                            | 11% ~08s          
  |+++++++                                           | 12% ~07s          
  |+++++++                                           | 13% ~07s          
  |++++++++                                          | 14% ~07s          
  |++++++++                                          | 15% ~07s          
  |+++++++++                                         | 16% ~07s          
  |+++++++++                                         | 17% ~07s          
  |++++++++++                                        | 18% ~07s          
  |++++++++++                                        | 19% ~07s          
  |+++++++++++                                       | 20% ~06s          
  |+++++++++++                                       | 21% ~06s          
  |++++++++++++                                      | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |+++++++++++++                                     | 24% ~06s          
  |+++++++++++++                                     | 25% ~06s          
  |++++++++++++++                                    | 26% ~06s          
  |++++++++++++++                                    | 27% ~06s          
  |+++++++++++++++                                   | 28% ~06s          
  |+++++++++++++++                                   | 29% ~06s          
  |++++++++++++++++                                  | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |+++++++++++++++++                                 | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |++++++++++++++++++                                | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |+++++++++++++++++++                               | 36% ~05s          
  |+++++++++++++++++++                               | 37% ~05s          
  |++++++++++++++++++++                              | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |+++++++++++++++++++++                             | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |++++++++++++++++++++++                            | 42% ~05s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |+++++++++++++++++++++++                           | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |++++++++++++++++++++++++                          | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |+++++++++++++++++++++++++                         | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |++++++++++++++++++++++++++++++                    | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |++++++++++++++++++++++++++++++++++                | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s  
Calculating cluster 5

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~06s          
  |++                                                | 2 % ~06s          
  |++                                                | 3 % ~06s          
  |+++                                               | 4 % ~06s          
  |+++                                               | 5 % ~06s          
  |++++                                              | 6 % ~06s          
  |++++                                              | 7 % ~06s          
  |+++++                                             | 8 % ~06s          
  |+++++                                             | 9 % ~05s          
  |++++++                                            | 10% ~05s          
  |++++++                                            | 11% ~05s          
  |+++++++                                           | 12% ~05s          
  |+++++++                                           | 13% ~05s          
  |++++++++                                          | 14% ~05s          
  |++++++++                                          | 15% ~05s          
  |+++++++++                                         | 16% ~05s          
  |+++++++++                                         | 17% ~05s          
  |++++++++++                                        | 18% ~05s          
  |++++++++++                                        | 19% ~05s          
  |+++++++++++                                       | 20% ~05s          
  |+++++++++++                                       | 21% ~05s          
  |++++++++++++                                      | 22% ~05s          
  |++++++++++++                                      | 23% ~05s          
  |+++++++++++++                                     | 24% ~05s          
  |+++++++++++++                                     | 26% ~04s          
  |++++++++++++++                                    | 27% ~04s          
  |++++++++++++++                                    | 28% ~04s          
  |+++++++++++++++                                   | 29% ~04s          
  |+++++++++++++++                                   | 30% ~04s          
  |++++++++++++++++                                  | 31% ~04s          
  |++++++++++++++++                                  | 32% ~04s          
  |+++++++++++++++++                                 | 33% ~04s          
  |+++++++++++++++++                                 | 34% ~04s          
  |++++++++++++++++++                                | 35% ~04s          
  |++++++++++++++++++                                | 36% ~04s          
  |+++++++++++++++++++                               | 37% ~04s          
  |+++++++++++++++++++                               | 38% ~04s          
  |++++++++++++++++++++                              | 39% ~04s          
  |++++++++++++++++++++                              | 40% ~04s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |+++++++++++++++++++++                             | 42% ~03s          
  |++++++++++++++++++++++                            | 43% ~03s          
  |++++++++++++++++++++++                            | 44% ~03s          
  |+++++++++++++++++++++++                           | 45% ~03s          
  |+++++++++++++++++++++++                           | 46% ~03s          
  |++++++++++++++++++++++++                          | 47% ~03s          
  |++++++++++++++++++++++++                          | 48% ~03s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |+++++++++++++++++++++++++                         | 50% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~03s          
  |+++++++++++++++++++++++++++                       | 52% ~03s          
  |+++++++++++++++++++++++++++                       | 53% ~03s          
  |++++++++++++++++++++++++++++                      | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |+++++++++++++++++++++++++++++                     | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |++++++++++++++++++++++++++++++                    | 58% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |+++++++++++++++++++++++++++++++                   | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |++++++++++++++++++++++++++++++++                  | 62% ~02s          
  |++++++++++++++++++++++++++++++++                  | 63% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |++++++++++++++++++++++++++++++++++                | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=06s  
Calculating cluster 6

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~10s          
  |++                                                | 2 % ~10s          
  |++                                                | 3 % ~09s          
  |+++                                               | 4 % ~09s          
  |+++                                               | 5 % ~09s          
  |++++                                              | 6 % ~09s          
  |++++                                              | 7 % ~09s          
  |+++++                                             | 8 % ~09s          
  |+++++                                             | 9 % ~09s          
  |++++++                                            | 10% ~09s          
  |++++++                                            | 11% ~08s          
  |+++++++                                           | 12% ~08s          
  |+++++++                                           | 13% ~08s          
  |++++++++                                          | 14% ~08s          
  |++++++++                                          | 15% ~08s          
  |+++++++++                                         | 16% ~08s          
  |+++++++++                                         | 17% ~08s          
  |++++++++++                                        | 18% ~08s          
  |++++++++++                                        | 19% ~08s          
  |+++++++++++                                       | 20% ~08s          
  |+++++++++++                                       | 21% ~07s          
  |++++++++++++                                      | 22% ~07s          
  |++++++++++++                                      | 23% ~07s          
  |+++++++++++++                                     | 24% ~07s          
  |+++++++++++++                                     | 25% ~07s          
  |++++++++++++++                                    | 26% ~07s          
  |++++++++++++++                                    | 27% ~07s          
  |+++++++++++++++                                   | 28% ~07s          
  |+++++++++++++++                                   | 29% ~08s          
  |++++++++++++++++                                  | 30% ~07s          
  |++++++++++++++++                                  | 31% ~07s          
  |+++++++++++++++++                                 | 32% ~07s          
  |+++++++++++++++++                                 | 33% ~07s          
  |++++++++++++++++++                                | 34% ~07s          
  |++++++++++++++++++                                | 35% ~07s          
  |+++++++++++++++++++                               | 36% ~07s          
  |+++++++++++++++++++                               | 37% ~07s          
  |++++++++++++++++++++                              | 38% ~06s          
  |++++++++++++++++++++                              | 39% ~06s          
  |+++++++++++++++++++++                             | 40% ~06s          
  |+++++++++++++++++++++                             | 41% ~06s          
  |++++++++++++++++++++++                            | 42% ~06s          
  |++++++++++++++++++++++                            | 43% ~06s          
  |+++++++++++++++++++++++                           | 44% ~06s          
  |+++++++++++++++++++++++                           | 45% ~06s          
  |++++++++++++++++++++++++                          | 46% ~05s          
  |++++++++++++++++++++++++                          | 47% ~05s          
  |+++++++++++++++++++++++++                         | 48% ~05s          
  |+++++++++++++++++++++++++                         | 49% ~05s          
  |++++++++++++++++++++++++++                        | 51% ~05s          
  |++++++++++++++++++++++++++                        | 52% ~05s          
  |+++++++++++++++++++++++++++                       | 53% ~05s          
  |+++++++++++++++++++++++++++                       | 54% ~05s          
  |++++++++++++++++++++++++++++                      | 55% ~05s          
  |++++++++++++++++++++++++++++                      | 56% ~04s          
  |+++++++++++++++++++++++++++++                     | 57% ~04s          
  |+++++++++++++++++++++++++++++                     | 58% ~04s          
  |++++++++++++++++++++++++++++++                    | 59% ~04s          
  |++++++++++++++++++++++++++++++                    | 60% ~04s          
  |+++++++++++++++++++++++++++++++                   | 61% ~04s          
  |+++++++++++++++++++++++++++++++                   | 62% ~04s          
  |++++++++++++++++++++++++++++++++                  | 63% ~04s          
  |++++++++++++++++++++++++++++++++                  | 64% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |++++++++++++++++++++++++++++++++++                | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=10s  
all_data.markers <- FindAllMarkers(all_data, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25) 
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~33s          
  |++                                                | 2 % ~33s          
  |++                                                | 3 % ~32s          
  |+++                                               | 4 % ~31s          
  |+++                                               | 5 % ~31s          
  |++++                                              | 6 % ~29s          
  |++++                                              | 7 % ~29s          
  |+++++                                             | 9 % ~28s          
  |+++++                                             | 10% ~27s          
  |++++++                                            | 11% ~27s          
  |++++++                                            | 12% ~27s          
  |+++++++                                           | 13% ~27s          
  |+++++++                                           | 14% ~27s          
  |++++++++                                          | 15% ~27s          
  |++++++++                                          | 16% ~27s          
  |+++++++++                                         | 17% ~26s          
  |++++++++++                                        | 18% ~26s          
  |++++++++++                                        | 19% ~26s          
  |+++++++++++                                       | 20% ~26s          
  |+++++++++++                                       | 21% ~25s          
  |++++++++++++                                      | 22% ~25s          
  |++++++++++++                                      | 23% ~25s          
  |+++++++++++++                                     | 24% ~25s          
  |+++++++++++++                                     | 26% ~24s          
  |++++++++++++++                                    | 27% ~24s          
  |++++++++++++++                                    | 28% ~24s          
  |+++++++++++++++                                   | 29% ~23s          
  |+++++++++++++++                                   | 30% ~23s          
  |++++++++++++++++                                  | 31% ~23s          
  |++++++++++++++++                                  | 32% ~22s          
  |+++++++++++++++++                                 | 33% ~22s          
  |++++++++++++++++++                                | 34% ~22s          
  |++++++++++++++++++                                | 35% ~22s          
  |+++++++++++++++++++                               | 36% ~21s          
  |+++++++++++++++++++                               | 37% ~21s          
  |++++++++++++++++++++                              | 38% ~20s          
  |++++++++++++++++++++                              | 39% ~20s          
  |+++++++++++++++++++++                             | 40% ~20s          
  |+++++++++++++++++++++                             | 41% ~20s          
  |++++++++++++++++++++++                            | 43% ~19s          
  |++++++++++++++++++++++                            | 44% ~19s          
  |+++++++++++++++++++++++                           | 45% ~19s          
  |+++++++++++++++++++++++                           | 46% ~18s          
  |++++++++++++++++++++++++                          | 47% ~18s          
  |++++++++++++++++++++++++                          | 48% ~18s          
  |+++++++++++++++++++++++++                         | 49% ~17s          
  |+++++++++++++++++++++++++                         | 50% ~17s          
  |++++++++++++++++++++++++++                        | 51% ~17s          
  |+++++++++++++++++++++++++++                       | 52% ~16s          
  |+++++++++++++++++++++++++++                       | 53% ~16s          
  |++++++++++++++++++++++++++++                      | 54% ~16s          
  |++++++++++++++++++++++++++++                      | 55% ~16s          
  |+++++++++++++++++++++++++++++                     | 56% ~15s          
  |+++++++++++++++++++++++++++++                     | 57% ~15s          
  |++++++++++++++++++++++++++++++                    | 59% ~14s          
  |++++++++++++++++++++++++++++++                    | 60% ~14s          
  |+++++++++++++++++++++++++++++++                   | 61% ~14s          
  |+++++++++++++++++++++++++++++++                   | 62% ~13s          
  |++++++++++++++++++++++++++++++++                  | 63% ~13s          
  |++++++++++++++++++++++++++++++++                  | 64% ~13s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~12s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~12s          
  |++++++++++++++++++++++++++++++++++                | 67% ~11s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~11s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~11s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~10s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~10s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~10s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~09s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~09s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~08s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~08s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~08s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~07s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=35s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~32s          
  |++                                                | 2 % ~30s          
  |++                                                | 3 % ~31s          
  |+++                                               | 4 % ~42s          
  |+++                                               | 5 % ~39s          
  |++++                                              | 7 % ~36s          
  |++++                                              | 8 % ~35s          
  |+++++                                             | 9 % ~33s          
  |+++++                                             | 10% ~32s          
  |++++++                                            | 11% ~31s          
  |+++++++                                           | 12% ~31s          
  |+++++++                                           | 13% ~30s          
  |++++++++                                          | 14% ~29s          
  |++++++++                                          | 15% ~29s          
  |+++++++++                                         | 16% ~28s          
  |+++++++++                                         | 18% ~28s          
  |++++++++++                                        | 19% ~27s          
  |++++++++++                                        | 20% ~26s          
  |+++++++++++                                       | 21% ~26s          
  |+++++++++++                                       | 22% ~25s          
  |++++++++++++                                      | 23% ~25s          
  |+++++++++++++                                     | 24% ~25s          
  |+++++++++++++                                     | 25% ~24s          
  |++++++++++++++                                    | 26% ~24s          
  |++++++++++++++                                    | 27% ~23s          
  |+++++++++++++++                                   | 29% ~23s          
  |+++++++++++++++                                   | 30% ~23s          
  |++++++++++++++++                                  | 31% ~22s          
  |++++++++++++++++                                  | 32% ~22s          
  |+++++++++++++++++                                 | 33% ~22s          
  |++++++++++++++++++                                | 34% ~21s          
  |++++++++++++++++++                                | 35% ~21s          
  |+++++++++++++++++++                               | 36% ~20s          
  |+++++++++++++++++++                               | 37% ~20s          
  |++++++++++++++++++++                              | 38% ~20s          
  |++++++++++++++++++++                              | 40% ~19s          
  |+++++++++++++++++++++                             | 41% ~19s          
  |+++++++++++++++++++++                             | 42% ~19s          
  |++++++++++++++++++++++                            | 43% ~18s          
  |++++++++++++++++++++++                            | 44% ~18s          
  |+++++++++++++++++++++++                           | 45% ~18s          
  |++++++++++++++++++++++++                          | 46% ~17s          
  |++++++++++++++++++++++++                          | 47% ~17s          
  |+++++++++++++++++++++++++                         | 48% ~17s          
  |+++++++++++++++++++++++++                         | 49% ~16s          
  |++++++++++++++++++++++++++                        | 51% ~16s          
  |++++++++++++++++++++++++++                        | 52% ~16s          
  |+++++++++++++++++++++++++++                       | 53% ~15s          
  |+++++++++++++++++++++++++++                       | 54% ~15s          
  |++++++++++++++++++++++++++++                      | 55% ~15s          
  |+++++++++++++++++++++++++++++                     | 56% ~14s          
  |+++++++++++++++++++++++++++++                     | 57% ~14s          
  |++++++++++++++++++++++++++++++                    | 58% ~13s          
  |++++++++++++++++++++++++++++++                    | 59% ~13s          
  |+++++++++++++++++++++++++++++++                   | 60% ~13s          
  |+++++++++++++++++++++++++++++++                   | 62% ~12s          
  |++++++++++++++++++++++++++++++++                  | 63% ~12s          
  |++++++++++++++++++++++++++++++++                  | 64% ~12s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~11s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~11s          
  |++++++++++++++++++++++++++++++++++                | 67% ~11s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~10s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~10s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~10s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~09s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~09s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~09s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~08s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~08s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~07s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~07s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=33s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 12s      
  |++                                                | 2 % ~01m 11s      
  |++                                                | 3 % ~01m 10s      
  |+++                                               | 5 % ~01m 09s      
  |+++                                               | 6 % ~01m 09s      
  |++++                                              | 7 % ~01m 07s      
  |+++++                                             | 8 % ~01m 06s      
  |+++++                                             | 9 % ~01m 06s      
  |++++++                                            | 10% ~01m 05s      
  |++++++                                            | 11% ~01m 04s      
  |+++++++                                           | 13% ~01m 04s      
  |+++++++                                           | 14% ~01m 03s      
  |++++++++                                          | 15% ~01m 03s      
  |+++++++++                                         | 16% ~01m 02s      
  |+++++++++                                         | 17% ~01m 01s      
  |++++++++++                                        | 18% ~01m 01s      
  |++++++++++                                        | 20% ~60s          
  |+++++++++++                                       | 21% ~59s          
  |+++++++++++                                       | 22% ~58s          
  |++++++++++++                                      | 23% ~57s          
  |+++++++++++++                                     | 24% ~58s          
  |+++++++++++++                                     | 25% ~57s          
  |++++++++++++++                                    | 26% ~56s          
  |++++++++++++++                                    | 28% ~55s          
  |+++++++++++++++                                   | 29% ~54s          
  |+++++++++++++++                                   | 30% ~53s          
  |++++++++++++++++                                  | 31% ~52s          
  |+++++++++++++++++                                 | 32% ~51s          
  |+++++++++++++++++                                 | 33% ~50s          
  |++++++++++++++++++                                | 34% ~49s          
  |++++++++++++++++++                                | 36% ~48s          
  |+++++++++++++++++++                               | 37% ~47s          
  |+++++++++++++++++++                               | 38% ~46s          
  |++++++++++++++++++++                              | 39% ~46s          
  |+++++++++++++++++++++                             | 40% ~45s          
  |+++++++++++++++++++++                             | 41% ~44s          
  |++++++++++++++++++++++                            | 43% ~43s          
  |++++++++++++++++++++++                            | 44% ~42s          
  |+++++++++++++++++++++++                           | 45% ~41s          
  |+++++++++++++++++++++++                           | 46% ~40s          
  |++++++++++++++++++++++++                          | 47% ~40s          
  |+++++++++++++++++++++++++                         | 48% ~39s          
  |+++++++++++++++++++++++++                         | 49% ~38s          
  |++++++++++++++++++++++++++                        | 51% ~37s          
  |++++++++++++++++++++++++++                        | 52% ~37s          
  |+++++++++++++++++++++++++++                       | 53% ~36s          
  |++++++++++++++++++++++++++++                      | 54% ~35s          
  |++++++++++++++++++++++++++++                      | 55% ~34s          
  |+++++++++++++++++++++++++++++                     | 56% ~33s          
  |+++++++++++++++++++++++++++++                     | 57% ~32s          
  |++++++++++++++++++++++++++++++                    | 59% ~31s          
  |++++++++++++++++++++++++++++++                    | 60% ~30s          
  |+++++++++++++++++++++++++++++++                   | 61% ~29s          
  |++++++++++++++++++++++++++++++++                  | 62% ~28s          
  |++++++++++++++++++++++++++++++++                  | 63% ~28s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~27s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~26s          
  |++++++++++++++++++++++++++++++++++                | 67% ~25s          
  |++++++++++++++++++++++++++++++++++                | 68% ~24s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~23s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~22s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~22s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~21s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~20s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~19s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~18s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~17s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~17s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~16s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~15s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~14s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 16s
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 07s      
  |++                                                | 2 % ~01m 07s      
  |++                                                | 3 % ~01m 07s      
  |+++                                               | 4 % ~01m 05s      
  |+++                                               | 5 % ~01m 04s      
  |++++                                              | 6 % ~01m 03s      
  |++++                                              | 7 % ~01m 02s      
  |+++++                                             | 8 % ~01m 01s      
  |+++++                                             | 9 % ~01m 01s      
  |++++++                                            | 10% ~01m 01s      
  |++++++                                            | 11% ~01m 00s      
  |+++++++                                           | 12% ~60s          
  |+++++++                                           | 14% ~59s          
  |++++++++                                          | 15% ~59s          
  |++++++++                                          | 16% ~58s          
  |+++++++++                                         | 17% ~58s          
  |+++++++++                                         | 18% ~57s          
  |++++++++++                                        | 19% ~57s          
  |++++++++++                                        | 20% ~56s          
  |+++++++++++                                       | 21% ~55s          
  |+++++++++++                                       | 22% ~55s          
  |++++++++++++                                      | 23% ~54s          
  |++++++++++++                                      | 24% ~53s          
  |+++++++++++++                                     | 25% ~53s          
  |++++++++++++++                                    | 26% ~52s          
  |++++++++++++++                                    | 27% ~51s          
  |+++++++++++++++                                   | 28% ~52s          
  |+++++++++++++++                                   | 29% ~51s          
  |++++++++++++++++                                  | 30% ~50s          
  |++++++++++++++++                                  | 31% ~49s          
  |+++++++++++++++++                                 | 32% ~49s          
  |+++++++++++++++++                                 | 33% ~48s          
  |++++++++++++++++++                                | 34% ~47s          
  |++++++++++++++++++                                | 35% ~46s          
  |+++++++++++++++++++                               | 36% ~45s          
  |+++++++++++++++++++                               | 38% ~44s          
  |++++++++++++++++++++                              | 39% ~44s          
  |++++++++++++++++++++                              | 40% ~43s          
  |+++++++++++++++++++++                             | 41% ~42s          
  |+++++++++++++++++++++                             | 42% ~41s          
  |++++++++++++++++++++++                            | 43% ~41s          
  |++++++++++++++++++++++                            | 44% ~40s          
  |+++++++++++++++++++++++                           | 45% ~39s          
  |+++++++++++++++++++++++                           | 46% ~38s          
  |++++++++++++++++++++++++                          | 47% ~38s          
  |++++++++++++++++++++++++                          | 48% ~37s          
  |+++++++++++++++++++++++++                         | 49% ~36s          
  |+++++++++++++++++++++++++                         | 50% ~35s          
  |++++++++++++++++++++++++++                        | 51% ~35s          
  |+++++++++++++++++++++++++++                       | 52% ~34s          
  |+++++++++++++++++++++++++++                       | 53% ~33s          
  |++++++++++++++++++++++++++++                      | 54% ~32s          
  |++++++++++++++++++++++++++++                      | 55% ~32s          
  |+++++++++++++++++++++++++++++                     | 56% ~31s          
  |+++++++++++++++++++++++++++++                     | 57% ~30s          
  |++++++++++++++++++++++++++++++                    | 58% ~30s          
  |++++++++++++++++++++++++++++++                    | 59% ~29s          
  |+++++++++++++++++++++++++++++++                   | 60% ~28s          
  |+++++++++++++++++++++++++++++++                   | 61% ~27s          
  |++++++++++++++++++++++++++++++++                  | 62% ~27s          
  |++++++++++++++++++++++++++++++++                  | 64% ~26s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~25s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~24s          
  |++++++++++++++++++++++++++++++++++                | 67% ~24s          
  |++++++++++++++++++++++++++++++++++                | 68% ~23s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~22s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~21s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~21s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~20s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~19s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~19s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~18s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~17s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~16s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~16s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~15s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~14s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 11s
Calculating cluster 4

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 50s      
  |++                                                | 2 % ~01m 50s      
  |++                                                | 3 % ~01m 45s      
  |+++                                               | 4 % ~01m 43s      
  |+++                                               | 5 % ~01m 40s      
  |++++                                              | 6 % ~01m 37s      
  |++++                                              | 7 % ~01m 36s      
  |+++++                                             | 8 % ~01m 35s      
  |+++++                                             | 9 % ~01m 34s      
  |++++++                                            | 10% ~01m 33s      
  |++++++                                            | 11% ~01m 32s      
  |+++++++                                           | 12% ~01m 31s      
  |+++++++                                           | 13% ~01m 30s      
  |++++++++                                          | 14% ~01m 29s      
  |++++++++                                          | 15% ~01m 29s      
  |+++++++++                                         | 16% ~01m 28s      
  |+++++++++                                         | 17% ~01m 27s      
  |++++++++++                                        | 18% ~01m 26s      
  |++++++++++                                        | 19% ~01m 27s      
  |+++++++++++                                       | 20% ~01m 26s      
  |+++++++++++                                       | 21% ~01m 25s      
  |++++++++++++                                      | 22% ~01m 24s      
  |++++++++++++                                      | 23% ~01m 23s      
  |+++++++++++++                                     | 24% ~01m 21s      
  |+++++++++++++                                     | 26% ~01m 20s      
  |++++++++++++++                                    | 27% ~01m 18s      
  |++++++++++++++                                    | 28% ~01m 17s      
  |+++++++++++++++                                   | 29% ~01m 16s      
  |+++++++++++++++                                   | 30% ~01m 14s      
  |++++++++++++++++                                  | 31% ~01m 13s      
  |++++++++++++++++                                  | 32% ~01m 12s      
  |+++++++++++++++++                                 | 33% ~01m 11s      
  |+++++++++++++++++                                 | 34% ~01m 10s      
  |++++++++++++++++++                                | 35% ~01m 09s      
  |++++++++++++++++++                                | 36% ~01m 08s      
  |+++++++++++++++++++                               | 37% ~01m 07s      
  |+++++++++++++++++++                               | 38% ~01m 06s      
  |++++++++++++++++++++                              | 39% ~01m 05s      
  |++++++++++++++++++++                              | 40% ~01m 04s      
  |+++++++++++++++++++++                             | 41% ~01m 03s      
  |+++++++++++++++++++++                             | 42% ~01m 02s      
  |++++++++++++++++++++++                            | 43% ~01m 01s      
  |++++++++++++++++++++++                            | 44% ~60s          
  |+++++++++++++++++++++++                           | 45% ~59s          
  |+++++++++++++++++++++++                           | 46% ~58s          
  |++++++++++++++++++++++++                          | 47% ~56s          
  |++++++++++++++++++++++++                          | 48% ~55s          
  |+++++++++++++++++++++++++                         | 49% ~54s          
  |+++++++++++++++++++++++++                         | 50% ~53s          
  |++++++++++++++++++++++++++                        | 51% ~52s          
  |+++++++++++++++++++++++++++                       | 52% ~51s          
  |+++++++++++++++++++++++++++                       | 53% ~50s          
  |++++++++++++++++++++++++++++                      | 54% ~49s          
  |++++++++++++++++++++++++++++                      | 55% ~47s          
  |+++++++++++++++++++++++++++++                     | 56% ~46s          
  |+++++++++++++++++++++++++++++                     | 57% ~45s          
  |++++++++++++++++++++++++++++++                    | 58% ~44s          
  |++++++++++++++++++++++++++++++                    | 59% ~43s          
  |+++++++++++++++++++++++++++++++                   | 60% ~42s          
  |+++++++++++++++++++++++++++++++                   | 61% ~41s          
  |++++++++++++++++++++++++++++++++                  | 62% ~40s          
  |++++++++++++++++++++++++++++++++                  | 63% ~39s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~38s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~37s          
  |++++++++++++++++++++++++++++++++++                | 66% ~36s          
  |++++++++++++++++++++++++++++++++++                | 67% ~35s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~34s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~33s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~31s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~30s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~29s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~28s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~27s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~26s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~25s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~24s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~23s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~22s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~21s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~20s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~19s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~17s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~16s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~15s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~14s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~13s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 46s
Calculating cluster 5

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~30s          
  |++                                                | 3 % ~30s          
  |++                                                | 4 % ~31s          
  |+++                                               | 5 % ~30s          
  |++++                                              | 7 % ~29s          
  |++++                                              | 8 % ~29s          
  |+++++                                             | 9 % ~28s          
  |++++++                                            | 11% ~40m 03s      
  |++++++                                            | 12% ~35m 48s      
  |+++++++                                           | 13% ~31m 48s      
  |++++++++                                          | 14% ~28m 33s      
  |++++++++                                          | 16% ~25m 48s      
  |+++++++++                                         | 17% ~23m 29s      
  |++++++++++                                        | 18% ~21m 32s      
  |++++++++++                                        | 20% ~19m 50s      
  |+++++++++++                                       | 21% ~18m 19s      
  |++++++++++++                                      | 22% ~16m 59s      
  |++++++++++++                                      | 24% ~15m 47s      
  |+++++++++++++                                     | 25% ~14m 43s      
  |++++++++++++++                                    | 26% ~13m 46s      
  |++++++++++++++                                    | 28% ~12m 54s      
  |+++++++++++++++                                   | 29% ~12m 06s      
  |++++++++++++++++                                  | 30% ~11m 23s      
  |++++++++++++++++                                  | 32% ~10m 43s      
  |+++++++++++++++++                                 | 33% ~10m 06s      
  |++++++++++++++++++                                | 34% ~09m 33s      
  |++++++++++++++++++                                | 36% ~09m 01s      
  |+++++++++++++++++++                               | 37% ~08m 32s      
  |++++++++++++++++++++                              | 38% ~08m 05s      
  |++++++++++++++++++++                              | 39% ~07m 40s      
  |+++++++++++++++++++++                             | 41% ~07m 16s      
  |++++++++++++++++++++++                            | 42% ~06m 53s      
  |++++++++++++++++++++++                            | 43% ~06m 32s      
  |+++++++++++++++++++++++                           | 45% ~06m 13s      
  |++++++++++++++++++++++++                          | 46% ~05m 54s      
  |++++++++++++++++++++++++                          | 47% ~05m 36s      
  |+++++++++++++++++++++++++                         | 49% ~05m 19s      
  |+++++++++++++++++++++++++                         | 50% ~05m 04s      
  |++++++++++++++++++++++++++                        | 51% ~04m 48s      
  |+++++++++++++++++++++++++++                       | 53% ~04m 34s      
  |+++++++++++++++++++++++++++                       | 54% ~04m 21s      
  |++++++++++++++++++++++++++++                      | 55% ~04m 08s      
  |+++++++++++++++++++++++++++++                     | 57% ~03m 55s      
  |+++++++++++++++++++++++++++++                     | 58% ~03m 43s      
  |++++++++++++++++++++++++++++++                    | 59% ~03m 32s      
  |+++++++++++++++++++++++++++++++                   | 61% ~03m 21s      
  |+++++++++++++++++++++++++++++++                   | 62% ~03m 10s      
  |++++++++++++++++++++++++++++++++                  | 63% ~03m 00s      
  |+++++++++++++++++++++++++++++++++                 | 64% ~02m 50s      
  |+++++++++++++++++++++++++++++++++                 | 66% ~02m 41s      
  |++++++++++++++++++++++++++++++++++                | 67% ~02m 32s      
  |+++++++++++++++++++++++++++++++++++               | 68% ~02m 23s      
  |+++++++++++++++++++++++++++++++++++               | 70% ~02m 15s      
  |++++++++++++++++++++++++++++++++++++              | 71% ~02m 07s      
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01m 59s      
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01m 51s      
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01m 44s      
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01m 37s      
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01m 30s      
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01m 24s      
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01m 17s      
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01m 11s      
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01m 05s      
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~59s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~53s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~48s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~43s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~37s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~32s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~27s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~22s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~18s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~13s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=05m 21s
Calculating cluster 6

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 07s      
  |++                                                | 2 % ~01m 06s      
  |++                                                | 4 % ~01m 04s      
  |+++                                               | 5 % ~01m 04s      
  |+++                                               | 6 % ~01m 03s      
  |++++                                              | 7 % ~01m 02s      
  |+++++                                             | 8 % ~01m 01s      
  |+++++                                             | 10% ~01m 00s      
  |++++++                                            | 11% ~59s          
  |++++++                                            | 12% ~58s          
  |+++++++                                           | 13% ~58s          
  |++++++++                                          | 14% ~57s          
  |++++++++                                          | 15% ~56s          
  |+++++++++                                         | 17% ~55s          
  |+++++++++                                         | 18% ~55s          
  |++++++++++                                        | 19% ~54s          
  |+++++++++++                                       | 20% ~54s          
  |+++++++++++                                       | 21% ~53s          
  |++++++++++++                                      | 23% ~52s          
  |++++++++++++                                      | 24% ~52s          
  |+++++++++++++                                     | 25% ~51s          
  |++++++++++++++                                    | 26% ~50s          
  |++++++++++++++                                    | 27% ~49s          
  |+++++++++++++++                                   | 29% ~48s          
  |+++++++++++++++                                   | 30% ~48s          
  |++++++++++++++++                                  | 31% ~47s          
  |+++++++++++++++++                                 | 32% ~46s          
  |+++++++++++++++++                                 | 33% ~45s          
  |++++++++++++++++++                                | 35% ~45s          
  |++++++++++++++++++                                | 36% ~44s          
  |+++++++++++++++++++                               | 37% ~43s          
  |++++++++++++++++++++                              | 38% ~42s          
  |++++++++++++++++++++                              | 39% ~41s          
  |+++++++++++++++++++++                             | 40% ~41s          
  |+++++++++++++++++++++                             | 42% ~40s          
  |++++++++++++++++++++++                            | 43% ~39s          
  |+++++++++++++++++++++++                           | 44% ~38s          
  |+++++++++++++++++++++++                           | 45% ~37s          
  |++++++++++++++++++++++++                          | 46% ~37s          
  |++++++++++++++++++++++++                          | 48% ~36s          
  |+++++++++++++++++++++++++                         | 49% ~36s          
  |+++++++++++++++++++++++++                         | 50% ~35s          
  |++++++++++++++++++++++++++                        | 51% ~34s          
  |+++++++++++++++++++++++++++                       | 52% ~33s          
  |+++++++++++++++++++++++++++                       | 54% ~32s          
  |++++++++++++++++++++++++++++                      | 55% ~31s          
  |++++++++++++++++++++++++++++                      | 56% ~30s          
  |+++++++++++++++++++++++++++++                     | 57% ~29s          
  |++++++++++++++++++++++++++++++                    | 58% ~29s          
  |++++++++++++++++++++++++++++++                    | 60% ~28s          
  |+++++++++++++++++++++++++++++++                   | 61% ~27s          
  |+++++++++++++++++++++++++++++++                   | 62% ~26s          
  |++++++++++++++++++++++++++++++++                  | 63% ~25s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~24s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~24s          
  |++++++++++++++++++++++++++++++++++                | 67% ~23s          
  |++++++++++++++++++++++++++++++++++                | 68% ~22s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~21s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~20s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~20s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~19s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~18s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~17s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~16s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~16s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~15s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~14s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~12s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 09s
Calculating cluster 7

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~14s          
  |++                                                | 3 % ~14s          
  |++                                                | 4 % ~14s          
  |+++                                               | 5 % ~14s          
  |++++                                              | 7 % ~13s          
  |++++                                              | 8 % ~13s          
  |+++++                                             | 9 % ~13s          
  |++++++                                            | 11% ~13s          
  |++++++                                            | 12% ~13s          
  |+++++++                                           | 13% ~13s          
  |++++++++                                          | 15% ~12s          
  |++++++++                                          | 16% ~12s          
  |+++++++++                                         | 17% ~12s          
  |++++++++++                                        | 19% ~12s          
  |++++++++++                                        | 20% ~12s          
  |+++++++++++                                       | 21% ~11s          
  |++++++++++++                                      | 23% ~11s          
  |++++++++++++                                      | 24% ~11s          
  |+++++++++++++                                     | 25% ~11s          
  |++++++++++++++                                    | 27% ~11s          
  |++++++++++++++                                    | 28% ~10s          
  |+++++++++++++++                                   | 29% ~10s          
  |++++++++++++++++                                  | 31% ~10s          
  |++++++++++++++++                                  | 32% ~10s          
  |+++++++++++++++++                                 | 33% ~10s          
  |++++++++++++++++++                                | 35% ~10s          
  |++++++++++++++++++                                | 36% ~09s          
  |+++++++++++++++++++                               | 37% ~09s          
  |++++++++++++++++++++                              | 39% ~09s          
  |++++++++++++++++++++                              | 40% ~09s          
  |+++++++++++++++++++++                             | 41% ~09s          
  |++++++++++++++++++++++                            | 43% ~08s          
  |++++++++++++++++++++++                            | 44% ~08s          
  |+++++++++++++++++++++++                           | 45% ~08s          
  |++++++++++++++++++++++++                          | 47% ~08s          
  |++++++++++++++++++++++++                          | 48% ~08s          
  |+++++++++++++++++++++++++                         | 49% ~07s          
  |++++++++++++++++++++++++++                        | 51% ~07s          
  |++++++++++++++++++++++++++                        | 52% ~07s          
  |+++++++++++++++++++++++++++                       | 53% ~07s          
  |++++++++++++++++++++++++++++                      | 55% ~07s          
  |++++++++++++++++++++++++++++                      | 56% ~06s          
  |+++++++++++++++++++++++++++++                     | 57% ~06s          
  |++++++++++++++++++++++++++++++                    | 59% ~06s          
  |++++++++++++++++++++++++++++++                    | 60% ~06s          
  |+++++++++++++++++++++++++++++++                   | 61% ~06s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |++++++++++++++++++++++++++++++++                  | 64% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~05s          
  |++++++++++++++++++++++++++++++++++                | 67% ~05s          
  |++++++++++++++++++++++++++++++++++                | 68% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=16s  
Calculating cluster 8

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 38s      
  |++                                                | 2 % ~01m 38s      
  |++                                                | 3 % ~01m 36s      
  |+++                                               | 4 % ~01m 35s      
  |+++                                               | 5 % ~01m 33s      
  |++++                                              | 6 % ~01m 32s      
  |++++                                              | 7 % ~01m 32s      
  |+++++                                             | 8 % ~01m 32s      
  |+++++                                             | 9 % ~01m 32s      
  |++++++                                            | 10% ~01m 31s      
  |++++++                                            | 11% ~01m 30s      
  |+++++++                                           | 12% ~01m 30s      
  |+++++++                                           | 14% ~01m 29s      
  |++++++++                                          | 15% ~01m 28s      
  |++++++++                                          | 16% ~01m 27s      
  |+++++++++                                         | 17% ~01m 26s      
  |+++++++++                                         | 18% ~01m 25s      
  |++++++++++                                        | 19% ~01m 26s      
  |++++++++++                                        | 20% ~01m 25s      
  |+++++++++++                                       | 21% ~01m 23s      
  |+++++++++++                                       | 22% ~01m 22s      
  |++++++++++++                                      | 23% ~01m 21s      
  |++++++++++++                                      | 24% ~01m 20s      
  |+++++++++++++                                     | 25% ~01m 18s      
  |++++++++++++++                                    | 26% ~01m 17s      
  |++++++++++++++                                    | 27% ~01m 16s      
  |+++++++++++++++                                   | 28% ~01m 15s      
  |+++++++++++++++                                   | 29% ~01m 14s      
  |++++++++++++++++                                  | 30% ~01m 12s      
  |++++++++++++++++                                  | 31% ~01m 11s      
  |+++++++++++++++++                                 | 32% ~01m 10s      
  |+++++++++++++++++                                 | 33% ~01m 09s      
  |++++++++++++++++++                                | 34% ~01m 08s      
  |++++++++++++++++++                                | 35% ~01m 07s      
  |+++++++++++++++++++                               | 36% ~01m 06s      
  |+++++++++++++++++++                               | 38% ~01m 06s      
  |++++++++++++++++++++                              | 39% ~01m 04s      
  |++++++++++++++++++++                              | 40% ~01m 03s      
  |+++++++++++++++++++++                             | 41% ~01m 02s      
  |+++++++++++++++++++++                             | 42% ~01m 01s      
  |++++++++++++++++++++++                            | 43% ~60s          
  |++++++++++++++++++++++                            | 44% ~59s          
  |+++++++++++++++++++++++                           | 45% ~58s          
  |+++++++++++++++++++++++                           | 46% ~57s          
  |++++++++++++++++++++++++                          | 47% ~55s          
  |++++++++++++++++++++++++                          | 48% ~54s          
  |+++++++++++++++++++++++++                         | 49% ~53s          
  |+++++++++++++++++++++++++                         | 50% ~52s          
  |++++++++++++++++++++++++++                        | 51% ~51s          
  |+++++++++++++++++++++++++++                       | 52% ~50s          
  |+++++++++++++++++++++++++++                       | 53% ~49s          
  |++++++++++++++++++++++++++++                      | 54% ~48s          
  |++++++++++++++++++++++++++++                      | 55% ~47s          
  |+++++++++++++++++++++++++++++                     | 56% ~46s          
  |+++++++++++++++++++++++++++++                     | 57% ~45s          
  |++++++++++++++++++++++++++++++                    | 58% ~44s          
  |++++++++++++++++++++++++++++++                    | 59% ~42s          
  |+++++++++++++++++++++++++++++++                   | 60% ~41s          
  |+++++++++++++++++++++++++++++++                   | 61% ~40s          
  |++++++++++++++++++++++++++++++++                  | 62% ~39s          
  |++++++++++++++++++++++++++++++++                  | 64% ~38s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~37s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~36s          
  |++++++++++++++++++++++++++++++++++                | 67% ~35s          
  |++++++++++++++++++++++++++++++++++                | 68% ~34s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~32s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~31s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~30s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~29s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~28s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~27s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~26s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~25s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~24s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~23s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~22s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~21s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~20s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~18s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~17s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~16s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~15s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~14s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~13s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 43s
Calculating cluster 9

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02m 19s      
  |++                                                | 2 % ~02m 17s      
  |++                                                | 3 % ~02m 13s      
  |+++                                               | 4 % ~02m 11s      
  |+++                                               | 5 % ~02m 11s      
  |++++                                              | 6 % ~02m 11s      
  |++++                                              | 7 % ~02m 10s      
  |+++++                                             | 9 % ~02m 09s      
  |+++++                                             | 10% ~02m 08s      
  |++++++                                            | 11% ~02m 07s      
  |++++++                                            | 12% ~02m 05s      
  |+++++++                                           | 13% ~02m 04s      
  |+++++++                                           | 14% ~02m 05s      
  |++++++++                                          | 15% ~02m 03s      
  |++++++++                                          | 16% ~02m 01s      
  |+++++++++                                         | 17% ~01m 59s      
  |++++++++++                                        | 18% ~01m 57s      
  |++++++++++                                        | 19% ~01m 55s      
  |+++++++++++                                       | 20% ~01m 53s      
  |+++++++++++                                       | 21% ~01m 52s      
  |++++++++++++                                      | 22% ~01m 51s      
  |++++++++++++                                      | 23% ~01m 49s      
  |+++++++++++++                                     | 24% ~01m 48s      
  |+++++++++++++                                     | 26% ~01m 46s      
  |++++++++++++++                                    | 27% ~01m 45s      
  |++++++++++++++                                    | 28% ~01m 44s      
  |+++++++++++++++                                   | 29% ~01m 42s      
  |+++++++++++++++                                   | 30% ~01m 40s      
  |++++++++++++++++                                  | 31% ~01m 39s      
  |++++++++++++++++                                  | 32% ~01m 37s      
  |+++++++++++++++++                                 | 33% ~01m 35s      
  |++++++++++++++++++                                | 34% ~01m 33s      
  |++++++++++++++++++                                | 35% ~01m 32s      
  |+++++++++++++++++++                               | 36% ~01m 30s      
  |+++++++++++++++++++                               | 37% ~01m 29s      
  |++++++++++++++++++++                              | 38% ~01m 27s      
  |++++++++++++++++++++                              | 39% ~01m 26s      
  |+++++++++++++++++++++                             | 40% ~01m 25s      
  |+++++++++++++++++++++                             | 41% ~01m 24s      
  |++++++++++++++++++++++                            | 43% ~01m 22s      
  |++++++++++++++++++++++                            | 44% ~01m 21s      
  |+++++++++++++++++++++++                           | 45% ~01m 19s      
  |+++++++++++++++++++++++                           | 46% ~01m 17s      
  |++++++++++++++++++++++++                          | 47% ~01m 16s      
  |++++++++++++++++++++++++                          | 48% ~01m 14s      
  |+++++++++++++++++++++++++                         | 49% ~01m 13s      
  |+++++++++++++++++++++++++                         | 50% ~01m 11s      
  |++++++++++++++++++++++++++                        | 51% ~01m 10s      
  |+++++++++++++++++++++++++++                       | 52% ~01m 08s      
  |+++++++++++++++++++++++++++                       | 53% ~01m 07s      
  |++++++++++++++++++++++++++++                      | 54% ~01m 05s      
  |++++++++++++++++++++++++++++                      | 55% ~01m 04s      
  |+++++++++++++++++++++++++++++                     | 56% ~01m 02s      
  |+++++++++++++++++++++++++++++                     | 57% ~01m 01s      
  |++++++++++++++++++++++++++++++                    | 59% ~59s          
  |++++++++++++++++++++++++++++++                    | 60% ~58s          
  |+++++++++++++++++++++++++++++++                   | 61% ~56s          
  |+++++++++++++++++++++++++++++++                   | 62% ~54s          
  |++++++++++++++++++++++++++++++++                  | 63% ~53s          
  |++++++++++++++++++++++++++++++++                  | 64% ~51s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~50s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~48s          
  |++++++++++++++++++++++++++++++++++                | 67% ~47s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~45s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~44s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~42s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~41s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~39s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~38s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~36s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~35s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~33s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~32s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~30s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~29s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~27s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~26s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~24s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~23s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~21s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~20s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~18s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~17s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~15s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~14s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02m 22s
Calculating cluster 10

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~45s          
  |++                                                | 2 % ~47s          
  |++                                                | 3 % ~45s          
  |+++                                               | 4 % ~45s          
  |+++                                               | 5 % ~44s          
  |++++                                              | 7 % ~44s          
  |++++                                              | 8 % ~43s          
  |+++++                                             | 9 % ~42s          
  |+++++                                             | 10% ~42s          
  |++++++                                            | 11% ~41s          
  |++++++                                            | 12% ~40s          
  |+++++++                                           | 13% ~40s          
  |++++++++                                          | 14% ~39s          
  |++++++++                                          | 15% ~39s          
  |+++++++++                                         | 16% ~39s          
  |+++++++++                                         | 17% ~38s          
  |++++++++++                                        | 18% ~38s          
  |++++++++++                                        | 20% ~38s          
  |+++++++++++                                       | 21% ~37s          
  |+++++++++++                                       | 22% ~37s          
  |++++++++++++                                      | 23% ~36s          
  |++++++++++++                                      | 24% ~36s          
  |+++++++++++++                                     | 25% ~36s          
  |++++++++++++++                                    | 26% ~35s          
  |++++++++++++++                                    | 27% ~35s          
  |+++++++++++++++                                   | 28% ~34s          
  |+++++++++++++++                                   | 29% ~35s          
  |++++++++++++++++                                  | 30% ~34s          
  |++++++++++++++++                                  | 32% ~34s          
  |+++++++++++++++++                                 | 33% ~33s          
  |+++++++++++++++++                                 | 34% ~32s          
  |++++++++++++++++++                                | 35% ~32s          
  |++++++++++++++++++                                | 36% ~31s          
  |+++++++++++++++++++                               | 37% ~31s          
  |++++++++++++++++++++                              | 38% ~30s          
  |++++++++++++++++++++                              | 39% ~29s          
  |+++++++++++++++++++++                             | 40% ~29s          
  |+++++++++++++++++++++                             | 41% ~28s          
  |++++++++++++++++++++++                            | 42% ~28s          
  |++++++++++++++++++++++                            | 43% ~27s          
  |+++++++++++++++++++++++                           | 45% ~27s          
  |+++++++++++++++++++++++                           | 46% ~26s          
  |++++++++++++++++++++++++                          | 47% ~26s          
  |++++++++++++++++++++++++                          | 48% ~25s          
  |+++++++++++++++++++++++++                         | 49% ~25s          
  |+++++++++++++++++++++++++                         | 50% ~24s          
  |++++++++++++++++++++++++++                        | 51% ~23s          
  |+++++++++++++++++++++++++++                       | 52% ~23s          
  |+++++++++++++++++++++++++++                       | 53% ~22s          
  |++++++++++++++++++++++++++++                      | 54% ~22s          
  |++++++++++++++++++++++++++++                      | 55% ~21s          
  |+++++++++++++++++++++++++++++                     | 57% ~21s          
  |+++++++++++++++++++++++++++++                     | 58% ~20s          
  |++++++++++++++++++++++++++++++                    | 59% ~20s          
  |++++++++++++++++++++++++++++++                    | 60% ~19s          
  |+++++++++++++++++++++++++++++++                   | 61% ~19s          
  |+++++++++++++++++++++++++++++++                   | 62% ~19s          
  |++++++++++++++++++++++++++++++++                  | 63% ~18s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~18s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~17s          
  |++++++++++++++++++++++++++++++++++                | 66% ~16s          
  |++++++++++++++++++++++++++++++++++                | 67% ~16s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~15s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~15s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~14s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~14s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~13s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~13s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~12s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~12s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~11s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~10s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=48s  
Calculating cluster 11

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02m 51s      
  |++                                                | 2 % ~02m 51s      
  |++                                                | 3 % ~02m 48s      
  |+++                                               | 4 % ~02m 44s      
  |+++                                               | 5 % ~02m 42s      
  |++++                                              | 6 % ~02m 43s      
  |++++                                              | 7 % ~02m 42s      
  |+++++                                             | 8 % ~02m 41s      
  |+++++                                             | 9 % ~02m 43s      
  |++++++                                            | 11% ~02m 40s      
  |++++++                                            | 12% ~02m 38s      
  |+++++++                                           | 13% ~02m 36s      
  |+++++++                                           | 14% ~02m 33s      
  |++++++++                                          | 15% ~02m 31s      
  |++++++++                                          | 16% ~02m 29s      
  |+++++++++                                         | 17% ~02m 27s      
  |+++++++++                                         | 18% ~02m 26s      
  |++++++++++                                        | 19% ~02m 26s      
  |++++++++++                                        | 20% ~02m 25s      
  |+++++++++++                                       | 21% ~02m 22s      
  |++++++++++++                                      | 22% ~02m 20s      
  |++++++++++++                                      | 23% ~02m 18s      
  |+++++++++++++                                     | 24% ~02m 15s      
  |+++++++++++++                                     | 25% ~02m 13s      
  |++++++++++++++                                    | 26% ~02m 11s      
  |++++++++++++++                                    | 27% ~02m 09s      
  |+++++++++++++++                                   | 28% ~02m 07s      
  |+++++++++++++++                                   | 29% ~02m 06s      
  |++++++++++++++++                                  | 31% ~02m 04s      
  |++++++++++++++++                                  | 32% ~02m 02s      
  |+++++++++++++++++                                 | 33% ~02m 00s      
  |+++++++++++++++++                                 | 34% ~01m 59s      
  |++++++++++++++++++                                | 35% ~01m 57s      
  |++++++++++++++++++                                | 36% ~01m 56s      
  |+++++++++++++++++++                               | 37% ~01m 54s      
  |+++++++++++++++++++                               | 38% ~01m 52s      
  |++++++++++++++++++++                              | 39% ~01m 50s      
  |++++++++++++++++++++                              | 40% ~01m 48s      
  |+++++++++++++++++++++                             | 41% ~01m 46s      
  |++++++++++++++++++++++                            | 42% ~01m 44s      
  |++++++++++++++++++++++                            | 43% ~01m 42s      
  |+++++++++++++++++++++++                           | 44% ~01m 40s      
  |+++++++++++++++++++++++                           | 45% ~01m 39s      
  |++++++++++++++++++++++++                          | 46% ~01m 37s      
  |++++++++++++++++++++++++                          | 47% ~01m 35s      
  |+++++++++++++++++++++++++                         | 48% ~01m 33s      
  |+++++++++++++++++++++++++                         | 49% ~01m 31s      
  |++++++++++++++++++++++++++                        | 51% ~01m 29s      
  |++++++++++++++++++++++++++                        | 52% ~01m 27s      
  |+++++++++++++++++++++++++++                       | 53% ~01m 26s      
  |+++++++++++++++++++++++++++                       | 54% ~01m 24s      
  |++++++++++++++++++++++++++++                      | 55% ~01m 22s      
  |++++++++++++++++++++++++++++                      | 56% ~01m 20s      
  |+++++++++++++++++++++++++++++                     | 57% ~01m 18s      
  |+++++++++++++++++++++++++++++                     | 58% ~01m 16s      
  |++++++++++++++++++++++++++++++                    | 59% ~01m 14s      
  |++++++++++++++++++++++++++++++                    | 60% ~01m 12s      
  |+++++++++++++++++++++++++++++++                   | 61% ~01m 11s      
  |++++++++++++++++++++++++++++++++                  | 62% ~01m 09s      
  |++++++++++++++++++++++++++++++++                  | 63% ~01m 07s      
  |+++++++++++++++++++++++++++++++++                 | 64% ~01m 05s      
  |+++++++++++++++++++++++++++++++++                 | 65% ~01m 03s      
  |++++++++++++++++++++++++++++++++++                | 66% ~01m 01s      
  |++++++++++++++++++++++++++++++++++                | 67% ~59s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~57s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~56s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~54s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~52s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~50s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~48s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~46s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~44s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~42s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~40s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~39s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~37s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~35s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~33s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~31s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~29s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~27s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~25s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~23s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~21s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~19s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~17s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~15s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~14s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~12s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03m 04s
save(all_data.markers, cis_markers, cocl2_markers, dabtram_markers, file = 'all_data_markers.RData')
#find lineages that are maintained at both dabtram timepoints
fivecell_cDNA$DabTramMaintained <- Reduce(intersect, list(fivecell_cDNA$DabTram, fivecell_cDNA$DabTramtoDabTram))

filtered_meta <- rep(0, length(names(all_data$Lineage)))

#specify which cells are in lineages that pass filtering for that condition
filtered_meta[which(all_data$OG_condition == "dabtram" & all_data$Lineage %in% combined_lins_list$DabTram)] <- 'Resistant to DabTram'
filtered_meta[which(all_data$OG_condition == "dabtramtodabtram" & all_data$Lineage %in% combined_lins_list$DabTramtoDabTram)] <- 'Resistant to DabTramtoDabTram'
filtered_meta[which(all_data$OG_condition == "dabtramtococl2" & all_data$Lineage %in% combined_lins_list$DabTramtoCoCl2)] <- 'Resistant to DabTramtoCoCl2'
filtered_meta[which(all_data$OG_condition == "dabtramtocis" & all_data$Lineage %in% combined_lins_list$DabTramtoCis)] <- 'Resistant to DabTramtoCis'
filtered_meta[which(all_data$OG_condition == "cocl2" & all_data$Lineage %in% combined_lins_list$CoCl2)] <- 'Resistant to CoCl2'
filtered_meta[which(all_data$OG_condition == "cocl2todabtram" & all_data$Lineage %in% combined_lins_list$CoCl2toDabTram)] <- 'Resistant to CoCl2toDabTram'
filtered_meta[which(all_data$OG_condition == "cocl2tococl2" & all_data$Lineage %in% combined_lins_list$CoCl2toCoCl2)] <- 'Resistant to CoCl2toCoCl2'
filtered_meta[which(all_data$OG_condition == "cocl2tocis" & all_data$Lineage %in% combined_lins_list$CoCl2toCis)] <- 'Resistant to CoCl2toCis'
filtered_meta[which(all_data$OG_condition == "cis" & all_data$Lineage %in% combined_lins_list$Cis)] <- 'Resistant to Cis'
filtered_meta[which(all_data$OG_condition == "cistodabtram" & all_data$Lineage %in% combined_lins_list$CistoDabTram)] <- 'Resistant to CistoDabTram'
filtered_meta[which(all_data$OG_condition == "cistococl2" & all_data$Lineage %in% combined_lins_list$CistoCoCl2)] <- 'Resistant to CistoCoCl2'
filtered_meta[which(all_data$OG_condition == "cistocis" & all_data$Lineage %in% combined_lins_list$CistoCis)] <- 'Resistant to CistoCis'

#specify which cells are in lineages of more than 5 cells
filtered_meta[which(all_data$OG_condition == "dabtram" & all_data$Lineage %in% fivecell_cDNA$DabTram)] <- 'Large Resistant to DabTram'
filtered_meta[which(all_data$OG_condition == "dabtramtodabtram" & all_data$Lineage %in% fivecell_cDNA$DabTramtoDabTram)] <- 'Large Resistant to DabTramtoDabTram'
filtered_meta[which(all_data$OG_condition == "dabtramtococl2" & all_data$Lineage %in% fivecell_cDNA$DabTramtoCoCl2)] <- 'Large Resistant to DabTramtoCoCl2'
filtered_meta[which(all_data$OG_condition == "dabtramtocis" & all_data$Lineage %in% fivecell_cDNA$DabTramtoCis)] <- 'Large Resistant to DabTramtoCis'
filtered_meta[which(all_data$OG_condition == "cocl2" & all_data$Lineage %in% fivecell_cDNA$CoCl2)] <- 'Large Resistant to CoCl2'
filtered_meta[which(all_data$OG_condition == "cocl2todabtram" & all_data$Lineage %in% fivecell_cDNA$CoCl2toDabTram)] <- 'Large Resistant to CoCl2toDabTram'
filtered_meta[which(all_data$OG_condition == "cocl2tococl2" & all_data$Lineage %in% fivecell_cDNA$CoCl2toCoCl2)] <- 'Large Resistant to CoCl2toCoCl2'
filtered_meta[which(all_data$OG_condition == "cocl2tocis" & all_data$Lineage %in% fivecell_cDNA$CoCl2toCis)] <- 'Large Resistant to CoCl2toCis'
filtered_meta[which(all_data$OG_condition == "cis" & all_data$Lineage %in% fivecell_cDNA$Cis)] <- 'Large Resistant to Cis'
filtered_meta[which(all_data$OG_condition == "cistodabtram" & all_data$Lineage %in% fivecell_cDNA$CistoDabTram)] <- 'Large Resistant to CistoDabTram'
filtered_meta[which(all_data$OG_condition == "cistococl2" & all_data$Lineage %in% fivecell_cDNA$CistoCoCl2)] <- 'Large Resistant to CistoCoCl2'
filtered_meta[which(all_data$OG_condition == "cistocis" & all_data$Lineage %in% fivecell_cDNA$CistoCis)] <- 'Large Resistant to CistoCis'

# filtered_meta[which(all_data$OG_condition == "dabtram" & all_data$Lineage %in% fivecell_cDNA$DabTramMaintained)] <- 'Maintained Resistant to DabTram'
# filtered_meta[which(all_data$OG_condition == "dabtramtodabtram" & all_data$Lineage %in% fivecell_cDNA$DabTramMaintained)] <- 'Maintained Resistant to DabTramtoDabTram'

#specify which cells are in lineages that did not pass filtering
filtered_meta[which(all_data$OG_condition == "dabtram" & all_data$Lineage %nin% combined_lins_list$DabTram & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "dabtramtodabtram" & all_data$Lineage %nin% combined_lins_list$DabTramtoDabTram & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "dabtramtococl2" & all_data$Lineage %nin% combined_lins_list$DabTramtoCoCl2 & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "dabtramtocis" & all_data$Lineage %nin% combined_lins_list$DabTramtoCis & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cocl2" & all_data$Lineage %nin% combined_lins_list$CoCl2 & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cocl2todabtram" & all_data$Lineage %nin% combined_lins_list$CoCl2toDabTram & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cocl2tococl2" & all_data$Lineage %nin% combined_lins_list$CoCl2toCoCl2 & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cocl2tocis" & all_data$Lineage %nin% combined_lins_list$CoCl2toCis & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cis" & all_data$Lineage %nin% combined_lins_list$Cis & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cistodabtram" & all_data$Lineage %nin% combined_lins_list$CistoDabTram & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cistococl2" & all_data$Lineage %nin% combined_lins_list$CistoCoCl2 & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cistocis" & all_data$Lineage %nin% combined_lins_list$CistoCis & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 

#specify which cells had zero or multiple barcodes
filtered_meta[which(all_data$Lineage %in% c("No Barcode", "Still multiple"))] <- 'No Barcode'

print(table(filtered_meta))
filtered_meta
                       Filtered out              Large Resistant to Cis         Large Resistant to CistoCis       Large Resistant to CistoCoCl2     Large Resistant to CistoDabTram 
                               3337                                1375                                 951                                2078                                1394 
           Large Resistant to CoCl2       Large Resistant to CoCl2toCis     Large Resistant to CoCl2toCoCl2   Large Resistant to CoCl2toDabTram          Large Resistant to DabTram 
                               1784                                3010                               11578                                 663                                 478 
    Large Resistant to DabTramtoCis   Large Resistant to DabTramtoCoCl2 Large Resistant to DabTramtoDabTram                          No Barcode                    Resistant to Cis 
                               4234                                2840                                3176                               35314                                 331 
              Resistant to CistoCis             Resistant to CistoCoCl2           Resistant to CistoDabTram                  Resistant to CoCl2             Resistant to CoCl2toCis 
                                 67                                 135                                 113                                 278                                 157 
          Resistant to CoCl2toCoCl2         Resistant to CoCl2toDabTram                Resistant to DabTram           Resistant to DabTramtoCis         Resistant to DabTramtoCoCl2 
                                 55                                  93                                 337                                 225                                 100 
      Resistant to DabTramtoDabTram 
                                222 
all_data$Resistant_filtered <- filtered_meta
Idents(all_data) <- all_data$Resistant_filtered
pdf('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/test_plot.pdf', height = 10, width = 20)
DimPlot(all_data, group.by = 'ident', cols = )
DimPlot(all_data, group.by = "Lineage") + theme(legend.position = 'none')
dev.off()
null device 
          1 

#Looking into the one lineage that switches ngfr -> egfr

pdf('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/test_violin.pdf', height = 10, width = 30)

VlnPlot(all_data, features = 'NGFR', idents = 'Maintained Resistant to DabTram', group.by = "Lineage") + theme(legend.position = 'none') + geom_boxplot(fill = 'white', width = 0.1)
Warning in SingleExIPlot(type = type, data = data[, x, drop = FALSE], idents = idents,  :
  All cells have the same value of NGFR.
Warning in max(data[, feature][is.finite(x = data[, feature])]) :
  no non-missing arguments to max; returning -Inf
Warning in min(data[, feature]) :
  no non-missing arguments to min; returning Inf
VlnPlot(all_data, features = 'EGFR', idents = 'Maintained Resistant to DabTram', group.by = "Lineage") + theme(legend.position = 'none') + geom_boxplot(fill = 'white', width = 0.1)
Warning in SingleExIPlot(type = type, data = data[, x, drop = FALSE], idents = idents,  :
  All cells have the same value of EGFR.
Warning in max(data[, feature][is.finite(x = data[, feature])]) :
  no non-missing arguments to max; returning -Inf
Warning in min(data[, feature]) :
  no non-missing arguments to min; returning Inf
VlnPlot(all_data, features = 'NGFR', idents = 'Maintained Resistant to DabTramtoDabTram', group.by = "Lineage") + theme(legend.position = 'none') + geom_boxplot(fill = 'white', width = 0.1)
Warning in SingleExIPlot(type = type, data = data[, x, drop = FALSE], idents = idents,  :
  All cells have the same value of NGFR.
Warning in max(data[, feature][is.finite(x = data[, feature])]) :
  no non-missing arguments to max; returning -Inf
Warning in min(data[, feature]) :
  no non-missing arguments to min; returning Inf
VlnPlot(all_data, features = 'EGFR', idents = 'Maintained Resistant to DabTramtoDabTram', group.by = "Lineage") + theme(legend.position = 'none') + geom_boxplot(fill = 'white', width = 0.1)
Warning in SingleExIPlot(type = type, data = data[, x, drop = FALSE], idents = idents,  :
  All cells have the same value of EGFR.
Warning in max(data[, feature][is.finite(x = data[, feature])]) :
  no non-missing arguments to max; returning -Inf
Warning in min(data[, feature]) :
  no non-missing arguments to min; returning Inf
VlnPlot(all_data, features = 'NGFR', idents = 'Large Resistant to DabTram', group.by = "Lineage") + theme(legend.position = 'none') + geom_boxplot(fill = 'white', width = 0.1)
VlnPlot(all_data, features = 'EGFR', idents = 'Large Resistant to DabTram', group.by = "Lineage") + theme(legend.position = 'none') + geom_boxplot(fill = 'white', width = 0.1)
VlnPlot(all_data, features = 'NGFR', idents = 'Large Resistant to DabTramtoDabTram', group.by = "Lineage") + theme(legend.position = 'none') + geom_boxplot(fill = 'white', width = 0.1)
VlnPlot(all_data, features = 'EGFR', idents = 'Large Resistant to DabTramtoDabTram', group.by = "Lineage") + theme(legend.position = 'none') + geom_boxplot(fill = 'white', width = 0.1)

dev.off()
null device 
          1 
#VlnPlot(all_data, features = 'NGFR', idents = all_data$OG_condition == 'dabtram', group.by = "lineage")

#from dabtram_both_times, force 2 clusters in umap, plot vs ngfr egfr, find markers of these 2


switch_lin_dabtram <- names(all_data$orig.ident[all_data$Lineage == "Lin171516" & all_data$OG_condition == 'dabtram'])
switch_lin_dabtramtodabtram <- names(all_data$orig.ident[all_data$Lineage == "Lin171516" & all_data$OG_condition == 'dabtramtodabtram'])

DimPlot(all_data, group.by = "OG_condition", cols = c('dabtram' = '#623594', 'cocl2' = '#0F8241', 'cis' = '#C96D29', 'dabtramtodabtram' = '#561E59', 'dabtramtococl2' = '#A2248E', 'dabtramtocis' = '#9D85BE', 'cocl2todabtram' = '#10413B', 'cocl2tococl2' = '#6ABD45', 'cocl2tocis' = '#6DC49C', 'cistodabtram' = '#A23622', 'cistococl2' = '#F49129', 'cistocis' = '#FBD08C'))

DimPlot(all_data, cells.highlight = list(switch_lin_dabtram), cols.highlight = c('red'))

DimPlot(all_data, cells.highlight = list(switch_lin_dabtram, switch_lin_dabtramtodabtram), cols.highlight = c('blue', 'red'))


switch_lin <- names(dabtram$orig.ident[dabtram$Lineage == "Lin171516"])
DimPlot(dabtram)

DimPlot(dabtram, cells.highlight = list(switch_lin))


#need to integrate lineages into just dabtram object and then plot off of this isntead?
#vlnplot(all_data, features = ngfr, idents = just the cells resistant to dabtram, group.by = lineage but i only want those included in combined_lins_list$dabtram ?

#Assign cluster assignments per lineage, find average score per lineage - make plots in order


dabtram_both_times_markers <- FindAllMarkers(dabtram_both_times, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~19s          
  |++                                                | 2 % ~34s          
  |++                                                | 3 % ~28s          
  |+++                                               | 4 % ~25s          
  |+++                                               | 6 % ~23s          
  |++++                                              | 7 % ~22s          
  |++++                                              | 8 % ~21s          
  |+++++                                             | 9 % ~20s          
  |+++++                                             | 10% ~24s          
  |++++++                                            | 11% ~23s          
  |+++++++                                           | 12% ~22s          
  |+++++++                                           | 13% ~21s          
  |++++++++                                          | 14% ~21s          
  |++++++++                                          | 16% ~20s          
  |+++++++++                                         | 17% ~19s          
  |+++++++++                                         | 18% ~19s          
  |++++++++++                                        | 19% ~18s          
  |++++++++++                                        | 20% ~18s          
  |+++++++++++                                       | 21% ~18s          
  |++++++++++++                                      | 22% ~17s          
  |++++++++++++                                      | 23% ~17s          
  |+++++++++++++                                     | 24% ~16s          
  |+++++++++++++                                     | 26% ~16s          
  |++++++++++++++                                    | 27% ~16s          
  |++++++++++++++                                    | 28% ~15s          
  |+++++++++++++++                                   | 29% ~15s          
  |+++++++++++++++                                   | 30% ~15s          
  |++++++++++++++++                                  | 31% ~14s          
  |+++++++++++++++++                                 | 32% ~14s          
  |+++++++++++++++++                                 | 33% ~14s          
  |++++++++++++++++++                                | 34% ~13s          
  |++++++++++++++++++                                | 36% ~13s          
  |+++++++++++++++++++                               | 37% ~13s          
  |+++++++++++++++++++                               | 38% ~13s          
  |++++++++++++++++++++                              | 39% ~12s          
  |++++++++++++++++++++                              | 40% ~12s          
  |+++++++++++++++++++++                             | 41% ~12s          
  |++++++++++++++++++++++                            | 42% ~12s          
  |++++++++++++++++++++++                            | 43% ~11s          
  |+++++++++++++++++++++++                           | 44% ~11s          
  |+++++++++++++++++++++++                           | 46% ~11s          
  |++++++++++++++++++++++++                          | 47% ~11s          
  |++++++++++++++++++++++++                          | 48% ~10s          
  |+++++++++++++++++++++++++                         | 49% ~10s          
  |+++++++++++++++++++++++++                         | 50% ~10s          
  |++++++++++++++++++++++++++                        | 51% ~10s          
  |+++++++++++++++++++++++++++                       | 52% ~09s          
  |+++++++++++++++++++++++++++                       | 53% ~09s          
  |++++++++++++++++++++++++++++                      | 54% ~09s          
  |++++++++++++++++++++++++++++                      | 56% ~09s          
  |+++++++++++++++++++++++++++++                     | 57% ~08s          
  |+++++++++++++++++++++++++++++                     | 58% ~08s          
  |++++++++++++++++++++++++++++++                    | 59% ~08s          
  |++++++++++++++++++++++++++++++                    | 60% ~08s          
  |+++++++++++++++++++++++++++++++                   | 61% ~08s          
  |++++++++++++++++++++++++++++++++                  | 62% ~07s          
  |++++++++++++++++++++++++++++++++                  | 63% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~06s          
  |++++++++++++++++++++++++++++++++++                | 68% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=19s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~20s          
  |+                                                 | 2 % ~20s          
  |++                                                | 3 % ~21s          
  |++                                                | 4 % ~20s          
  |+++                                               | 5 % ~20s          
  |+++                                               | 6 % ~20s          
  |++++                                              | 7 % ~20s          
  |++++                                              | 8 % ~19s          
  |+++++                                             | 9 % ~19s          
  |+++++                                             | 10% ~24s          
  |++++++                                            | 11% ~23s          
  |++++++                                            | 12% ~22s          
  |+++++++                                           | 13% ~22s          
  |+++++++                                           | 14% ~21s          
  |++++++++                                          | 15% ~21s          
  |++++++++                                          | 16% ~20s          
  |+++++++++                                         | 17% ~20s          
  |+++++++++                                         | 18% ~20s          
  |++++++++++                                        | 19% ~19s          
  |++++++++++                                        | 20% ~19s          
  |+++++++++++                                       | 21% ~18s          
  |+++++++++++                                       | 22% ~18s          
  |++++++++++++                                      | 23% ~18s          
  |++++++++++++                                      | 24% ~18s          
  |+++++++++++++                                     | 25% ~17s          
  |+++++++++++++                                     | 26% ~17s          
  |++++++++++++++                                    | 27% ~17s          
  |++++++++++++++                                    | 28% ~16s          
  |+++++++++++++++                                   | 29% ~16s          
  |+++++++++++++++                                   | 30% ~16s          
  |++++++++++++++++                                  | 31% ~16s          
  |++++++++++++++++                                  | 32% ~15s          
  |+++++++++++++++++                                 | 33% ~15s          
  |+++++++++++++++++                                 | 34% ~15s          
  |++++++++++++++++++                                | 35% ~14s          
  |++++++++++++++++++                                | 36% ~14s          
  |+++++++++++++++++++                               | 37% ~14s          
  |+++++++++++++++++++                               | 38% ~14s          
  |++++++++++++++++++++                              | 39% ~13s          
  |++++++++++++++++++++                              | 40% ~13s          
  |+++++++++++++++++++++                             | 41% ~13s          
  |+++++++++++++++++++++                             | 42% ~13s          
  |++++++++++++++++++++++                            | 43% ~13s          
  |++++++++++++++++++++++                            | 44% ~13s          
  |+++++++++++++++++++++++                           | 45% ~12s          
  |+++++++++++++++++++++++                           | 46% ~12s          
  |++++++++++++++++++++++++                          | 47% ~12s          
  |++++++++++++++++++++++++                          | 48% ~12s          
  |+++++++++++++++++++++++++                         | 49% ~11s          
  |+++++++++++++++++++++++++                         | 50% ~11s          
  |++++++++++++++++++++++++++                        | 51% ~11s          
  |++++++++++++++++++++++++++                        | 52% ~11s          
  |+++++++++++++++++++++++++++                       | 53% ~10s          
  |+++++++++++++++++++++++++++                       | 54% ~10s          
  |++++++++++++++++++++++++++++                      | 55% ~10s          
  |++++++++++++++++++++++++++++                      | 56% ~10s          
  |+++++++++++++++++++++++++++++                     | 57% ~09s          
  |+++++++++++++++++++++++++++++                     | 58% ~09s          
  |++++++++++++++++++++++++++++++                    | 59% ~09s          
  |++++++++++++++++++++++++++++++                    | 60% ~09s          
  |+++++++++++++++++++++++++++++++                   | 61% ~09s          
  |+++++++++++++++++++++++++++++++                   | 62% ~08s          
  |++++++++++++++++++++++++++++++++                  | 63% ~08s          
  |++++++++++++++++++++++++++++++++                  | 64% ~08s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~08s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~07s          
  |++++++++++++++++++++++++++++++++++                | 68% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~07s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~06s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=21s  
DimPlot(dabtram_both_times)

DimPlot(dabtram_both_times, group.by = 'OG_condition')

FeaturePlot(dabtram_both_times, features = c('NGFR', 'EGFR', 'nFeature_RNA'))

Look at whether lineages cluster together in each individual condition - Starting with DabTram

#average cell assignments per lineage in dabtram_maintained

#want to do a stacked barplot here-- copy paste code from condition clustering

#get lineage and cluster data from seurat object, switch cluster identifiers from 0,1 to -1,1 (egfr, ngfr)
clusters_per_lin <- data.frame (Cluster = as.numeric(as.character(dabtram_both_times$seurat_clusters)), Lineage = dabtram_both_times$Lineage, condition = dabtram_both_times$OG_condition)
clusters_per_lin$Cluster[clusters_per_lin$Cluster == 0] <- -1
clusters_per_lin_list <- list()

# Need to get percent values of EGFR for the lineage after the first treatment
for (i in fivecell_cDNA$DabTram){
  currentlin <- filter(clusters_per_lin, clusters_per_lin$Lineage == i & clusters_per_lin$condition == 'dabtram')
  Var1 <- c(-1,1)
  Freq <- c(sum(filter(clusters_per_lin, clusters_per_lin$Lineage == i & clusters_per_lin$condition == 'dabtram')$Cluster == -1), # EGFR
  sum(filter(clusters_per_lin, clusters_per_lin$Lineage == i & clusters_per_lin$condition == 'dabtram')$Cluster == 1))
  clusters_per_lin_list[[i]] <- data.frame('Var1' = Var1, 'Freq' = Freq)
  clusters_per_lin_list[[i]]$Score <- weighted.mean(as.numeric(as.character(clusters_per_lin_list[[i]]$Var1)), clusters_per_lin_list[[i]]$Freq)
}

# Build a dataframe for plotting based on % EGFR or NGFR per lineage after first treatment
clusters_per_lin_df <- data.frame(matrix(ncol = 5, nrow = 0))
colnames(clusters_per_lin_df) <- c('Lineage', 'Percent_cells', 'Num_cells', 'Score')
for (i in names(clusters_per_lin_list)){
    clusters_per_lin_df <- rbind(clusters_per_lin_df, data.frame('Lineage' = i, 'Percent_cells' = clusters_per_lin_list[[i]]$Freq[clusters_per_lin_list[[i]]$Var1 == 1]/sum(clusters_per_lin_list[[i]]$Freq), 'Num_cells' = sum(clusters_per_lin_list[[i]]$Freq[clusters_per_lin_list[[i]]$Var1 == 1]), 'Score' = clusters_per_lin_list[[i]]$Score[1], 'Cluster' = 'NGFR')) # Add NGFR row
  clusters_per_lin_df <- rbind(clusters_per_lin_df, data.frame('Lineage' = i, 'Percent_cells' = clusters_per_lin_list[[i]]$Freq[clusters_per_lin_list[[i]]$Var1 == -1]/sum(clusters_per_lin_list[[i]]$Freq), 'Num_cells' = sum(clusters_per_lin_list[[i]]$Freq[clusters_per_lin_list[[i]]$Var1 == -1]), 'Score' = clusters_per_lin_list[[i]]$Score[1], 'Cluster' = 'EGFR')) # Add EGFR row
}

# Reorder so that EGFR dominant lineages are plot first
clusters_per_lin_df <- clusters_per_lin_df[with(clusters_per_lin_df, order(-Score,Num_cells )),]
clusters_per_lin_df$Lineage <- factor(clusters_per_lin_df$Lineage, levels = rev(unique(clusters_per_lin_df$Lineage)))

# make list object for after second treatment
clusters_per_lin_list_sec <- list()

# Need to get percent values of EGFR for the lineage after the second treatment
for (i in fivecell_cDNA$DabTram){
  currentlin <- filter(clusters_per_lin, clusters_per_lin$Lineage == i & clusters_per_lin$condition == 'dabtramtodabtram')
  Var1 <- c(-1,1)
  Freq <- c(sum(filter(clusters_per_lin, clusters_per_lin$Lineage == i & clusters_per_lin$condition == 'dabtramtodabtram')$Cluster == -1), # EGFR
  sum(filter(clusters_per_lin, clusters_per_lin$Lineage == i & clusters_per_lin$condition == 'dabtramtodabtram')$Cluster == 1))
  clusters_per_lin_list_sec[[i]] <- data.frame('Var1' = Var1, 'Freq' = Freq)
  clusters_per_lin_list_sec[[i]]$Score <- weighted.mean(as.numeric(as.character(clusters_per_lin_list_sec[[i]]$Var1)), clusters_per_lin_list_sec[[i]]$Freq)
}

# Build a dataframe for plotting based on % EGFR or NGFR per lineage after second treatment
clusters_per_lin_df_sec <- data.frame(matrix(ncol = 5, nrow = 0))
colnames(clusters_per_lin_df_sec) <- c('Lineage', 'Percent_cells', 'Num_cells', 'Score', 'Cluster')
for (i in names(clusters_per_lin_list)){

  if (sum(clusters_per_lin_list_sec[[i]]$Freq) < 5){
    clusters_per_lin_df_sec <- rbind(clusters_per_lin_df_sec, data.frame('Lineage' = i, 'Percent_cells' = 1, 'Num_cells' = 0, 'Score' = 0, 'Cluster' = 'Died')) # Add Lineage died row
    clusters_per_lin_df_sec <- rbind(clusters_per_lin_df_sec, data.frame('Lineage' = i, 'Percent_cells' = 0, 'Num_cells' = 0, 'Score' = 0, 'Cluster' = 'NGFR')) # Add NGFR row
    clusters_per_lin_df_sec <- rbind(clusters_per_lin_df_sec, data.frame('Lineage' = i, 'Percent_cells' = 0, 'Num_cells' = 0, 'Score' = 0, 'Cluster' = 'EGFR')) # Add EGFR row
  }else{ # Actually calculate percentages since the lineage survived/is more than 5 cells
      clusters_per_lin_df_sec <- rbind(clusters_per_lin_df_sec, data.frame('Lineage' = i, 'Percent_cells' = 0, 'Num_cells' = 0, 'Score' = clusters_per_lin_list_sec[[i]]$Score[1], 'Cluster' = 'Died')) # Add Lineage died row
      clusters_per_lin_df_sec <- rbind(clusters_per_lin_df_sec, data.frame('Lineage' = i, 'Percent_cells' = clusters_per_lin_list_sec[[i]]$Freq[clusters_per_lin_list_sec[[i]]$Var1 == 1]/sum(clusters_per_lin_list_sec[[i]]$Freq), 'Num_cells' = sum(clusters_per_lin_list_sec[[i]]$Freq[clusters_per_lin_list_sec[[i]]$Var1 == 1]), 'Score' = clusters_per_lin_list_sec[[i]]$Score[1], 'Cluster' = 'NGFR')) # Add NGFR row
      clusters_per_lin_df_sec <- rbind(clusters_per_lin_df_sec, data.frame('Lineage' = i, 'Percent_cells' = clusters_per_lin_list_sec[[i]]$Freq[clusters_per_lin_list_sec[[i]]$Var1 == -1]/sum(clusters_per_lin_list_sec[[i]]$Freq), 'Num_cells' = sum(clusters_per_lin_list_sec[[i]]$Freq[clusters_per_lin_list_sec[[i]]$Var1 == -1]), 'Score' = clusters_per_lin_list_sec[[i]]$Score[1], 'Cluster' = 'EGFR')) # Add EGFR row
    }
}

# Reorder so that EGFR dominant lineages are plot first
clusters_per_lin_df_sec$Lineage <- factor(clusters_per_lin_df_sec$Lineage, levels = rev(unique(clusters_per_lin_df$Lineage)))

# Plot
p1 <- ggplot(clusters_per_lin_df, aes(y = Percent_cells, x = Lineage, fill = Cluster)) + geom_bar(stat = 'identity', position = position_fill(reverse = T), color = '#D3D3D3') + scale_fill_manual(values = c("#000000","#FFFFFF")) + theme_classic() + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
p2 <- ggplot(clusters_per_lin_df_sec, aes(y = Percent_cells, x = Lineage, fill = Cluster)) + geom_bar(stat = 'identity', position = position_fill(reverse = T), color = '#D3D3D3') + scale_fill_manual(values = c("#FF0000","#000000", '#FFFFFF')) + theme_classic() + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

pdf('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/stacked_bar_EGFR_NGFR_Died.pdf')
ggarrange(p1,p2, nrow = 2)
dev.off()
null device 
          1 

Significance testing of the dabtram simulation

rm(dabtram, cis, cocl2) # Remove old seurat objects that are no longer needed
Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to dabtram
dabtram <- subset(all_data, idents = 'dabtram') # Subset down to the dabtram object

ElbowPlot(dabtram) # The standard deviation seems to really level off at 10


# Recluster with the appropriate number of dimensions
dabtram <- FindNeighbors(dabtram, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
dabtram <- FindClusters(dabtram, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 3203
Number of edges: 108151

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8611
Number of communities: 7
Elapsed time: 0 seconds
dabtram <- RunUMAP(dabtram, dims = 1:10)
Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
This message will be shown once per session
12:11:39 UMAP embedding parameters a = 0.9922 b = 1.112
12:11:39 Read 3203 rows and found 10 numeric columns
12:11:39 Using Annoy for neighbor search, n_neighbors = 30
12:11:39 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:11:39 Writing NN index file to temp file /var/folders/ph/24prrxys02179y9_qzhxjgvc0000gn/T//Rtmpryniy5/fileb7bd26820f76
12:11:39 Searching Annoy index using 1 thread, search_k = 3000
12:11:40 Annoy recall = 100%
12:11:40 Commencing smooth kNN distance calibration using 1 thread
12:11:41 Initializing from normalized Laplacian + noise
12:11:42 Commencing optimization for 500 epochs, with 133908 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:11:46 Optimization finished
DimPlot(dabtram, reduction = 'umap')


# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
dabtram_lin_clust_list <- list()

for (i in fivecell_cDNA$DabTram){
  temp_df <- as.data.frame(table(Idents(dabtram)[dabtram$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  dabtram_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
dabtram_lin_clust_rand_list <- list()
num_iter <- 1000 
for(j in 1:num_iter){
  set.seed(j)
  dabtram_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$DabTram){
    num_cells <- length(dabtram$Lineage[dabtram$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(dabtram), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    dabtram_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Look at whether lineages cluster together in each individual condition - DabTramtoDabTram

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_dabtram <- mean(unlist(lapply(dabtram_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_dabtram_sim <- sapply(1:length(dabtram_lin_clust_rand_list), function(y)
  mean(unlist(lapply(dabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_dabtram <- (mean_dabtram-mean(means_dabtram_sim))/sd(means_dabtram_sim)
pval_mean_dabtram <- pnorm(z_mean_dabtram, mean(means_dabtram_sim), sd(means_dabtram_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_dabtram <- weighted.mean(unlist(lapply(dabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(dabtram_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_dabtram_sim <- sapply(1:length(dabtram_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(dabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(dabtram_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_dabtram <- (weighted_mean_dabtram-mean(weighted_means_dabtram_sim))/sd(weighted_means_dabtram_sim)
pval_wmean_dabtram <- pnorm(z_wmean_dabtram, mean(weighted_means_dabtram_sim), sd(weighted_means_dabtram_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_dabtram <- c()
for (i in 1:length(means_dabtram_sim)){
  sim_maxes <- unlist(lapply(dabtram_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_dabtram <- cbind(ttest_pval_dabtram,t.test(x = unlist(lapply(dabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(dabtram_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(dabtram_lin_clust_list, dabtram_lin_clust_rand_list,z_mean_dabtram,pval_mean_dabtram, z_wmean_dabtram, ttest_pval_dabtram, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/dabtram_sim_results.RData')
rm(dabtram)

Significance testing of the dabtramtodabtram simulation

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to dabtramtodabtram
dabtramtodabtram <- subset(all_data, idents = 'dabtramtodabtram') # Subset down to the dabtramtodabtram object

ElbowPlot(dabtramtodabtram) # The standard deviation seems to really level off at 10


# Recluster with the appropriate number of dimensions
dabtramtodabtram <- FindNeighbors(dabtramtodabtram, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
dabtramtodabtram <- FindClusters(dabtramtodabtram, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 6906
Number of edges: 222798

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8263
Number of communities: 7
Elapsed time: 0 seconds
dabtramtodabtram <- RunUMAP(dabtramtodabtram, dims = 1:10)
12:15:17 UMAP embedding parameters a = 0.9922 b = 1.112
12:15:17 Read 6906 rows and found 10 numeric columns
12:15:17 Using Annoy for neighbor search, n_neighbors = 30
12:15:17 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:15:18 Writing NN index file to temp file /var/folders/ph/24prrxys02179y9_qzhxjgvc0000gn/T//Rtmpryniy5/fileb7bd24c51fba
12:15:18 Searching Annoy index using 1 thread, search_k = 3000
12:15:20 Annoy recall = 100%
12:15:20 Commencing smooth kNN distance calibration using 1 thread
12:15:21 Initializing from normalized Laplacian + noise
12:15:21 Commencing optimization for 500 epochs, with 286280 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:15:30 Optimization finished
DimPlot(dabtramtodabtram, reduction = 'umap')


# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
dabtramtodabtram_lin_clust_list <- list()

for (i in fivecell_cDNA$DabTramtoDabTram){
  temp_df <- as.data.frame(table(Idents(dabtramtodabtram)[dabtramtodabtram$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  dabtramtodabtram_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
dabtramtodabtram_lin_clust_rand_list <- list()
num_iter <- 1000 
for(j in 1:num_iter){
  set.seed(j)
  dabtramtodabtram_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$DabTramtoDabTram){
    num_cells <- length(dabtramtodabtram$Lineage[dabtramtodabtram$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(dabtramtodabtram), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    dabtramtodabtram_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Look at whether lineages cluster together in each individual condition - DabTramtoCis

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_dabtramtodabtram <- mean(unlist(lapply(dabtramtodabtram_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_dabtramtodabtram_sim <- sapply(1:length(dabtramtodabtram_lin_clust_rand_list), function(y)
  mean(unlist(lapply(dabtramtodabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_dabtramtodabtram <- (mean_dabtramtodabtram-mean(means_dabtramtodabtram_sim))/sd(means_dabtramtodabtram_sim)
pval_mean_dabtramtodabtram <- pnorm(z_mean_dabtramtodabtram, mean(means_dabtramtodabtram_sim), sd(means_dabtramtodabtram_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_dabtramtodabtram <- weighted.mean(unlist(lapply(dabtramtodabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(dabtramtodabtram_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_dabtramtodabtram_sim <- sapply(1:length(dabtramtodabtram_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(dabtramtodabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(dabtramtodabtram_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_dabtramtodabtram <- (weighted_mean_dabtramtodabtram-mean(weighted_means_dabtramtodabtram_sim))/sd(weighted_means_dabtramtodabtram_sim)
pval_wmean_dabtramtodabtram <- pnorm(z_wmean_dabtramtodabtram, mean(weighted_means_dabtramtodabtram_sim), sd(weighted_means_dabtramtodabtram_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_dabtramtodabtram <- c()
for (i in 1:length(means_dabtramtodabtram_sim)){
  sim_maxes <- unlist(lapply(dabtramtodabtram_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_dabtramtodabtram <- cbind(ttest_pval_dabtramtodabtram,t.test(x = unlist(lapply(dabtramtodabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(dabtramtodabtram_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(dabtramtodabtram_lin_clust_list, dabtramtodabtram_lin_clust_rand_list,z_mean_dabtramtodabtram,pval_mean_dabtramtodabtram, z_wmean_dabtramtodabtram, ttest_pval_dabtramtodabtram, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/dabtramtodabtram_sim_results.RData')
rm(dabtramtodabtram)

Significance testing of the dabtramtocis simulation

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to dabtramtocis
dabtramtocis <- subset(all_data, idents = 'dabtramtocis') # Subset down to the dabtramtocis object

ElbowPlot(dabtramtocis) # The standard deviation seems to really level off at 10


# Recluster with the appropriate number of dimensions
dabtramtocis <- FindNeighbors(dabtramtocis, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
dabtramtocis <- FindClusters(dabtramtocis, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 7070
Number of edges: 235249

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8291
Number of communities: 7
Elapsed time: 0 seconds
dabtramtocis <- RunUMAP(dabtramtocis, dims = 1:10)
12:22:56 UMAP embedding parameters a = 0.9922 b = 1.112
12:22:56 Read 7070 rows and found 10 numeric columns
12:22:56 Using Annoy for neighbor search, n_neighbors = 30
12:22:56 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:22:57 Writing NN index file to temp file /var/folders/ph/24prrxys02179y9_qzhxjgvc0000gn/T//Rtmpryniy5/fileb7bd9a5ff32
12:22:57 Searching Annoy index using 1 thread, search_k = 3000
12:22:59 Annoy recall = 100%
12:23:00 Commencing smooth kNN distance calibration using 1 thread
12:23:01 Initializing from normalized Laplacian + noise
12:23:01 Commencing optimization for 500 epochs, with 294448 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:23:10 Optimization finished
DimPlot(dabtramtocis, reduction = 'umap')


# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
dabtramtocis_lin_clust_list <- list()

for (i in fivecell_cDNA$DabTramtoCis){
  temp_df <- as.data.frame(table(Idents(dabtramtocis)[dabtramtocis$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  dabtramtocis_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
dabtramtocis_lin_clust_rand_list <- list()
num_iter <- 1000 
for(j in 1:num_iter){
  set.seed(j)
  dabtramtocis_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$DabTramtoCis){
    num_cells <- length(dabtramtocis$Lineage[dabtramtocis$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(dabtramtocis), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    dabtramtocis_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Look at whether lineages cluster together in each individual condition - DabTramtoCis

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_dabtramtocis <- mean(unlist(lapply(dabtramtocis_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_dabtramtocis_sim <- sapply(1:length(dabtramtocis_lin_clust_rand_list), function(y)
  mean(unlist(lapply(dabtramtocis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_dabtramtocis <- (mean_dabtramtocis-mean(means_dabtramtocis_sim))/sd(means_dabtramtocis_sim)
pval_mean_dabtramtocis <- pnorm(z_mean_dabtramtocis, mean(means_dabtramtocis_sim), sd(means_dabtramtocis_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_dabtramtocis <- weighted.mean(unlist(lapply(dabtramtocis_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(dabtramtocis_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_dabtramtocis_sim <- sapply(1:length(dabtramtocis_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(dabtramtocis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(dabtramtocis_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_dabtramtocis <- (weighted_mean_dabtramtocis-mean(weighted_means_dabtramtocis_sim))/sd(weighted_means_dabtramtocis_sim)
pval_wmean_dabtramtocis <- pnorm(z_wmean_dabtramtocis, mean(weighted_means_dabtramtocis_sim), sd(weighted_means_dabtramtocis_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_dabtramtocis <- c()
for (i in 1:length(means_dabtramtocis_sim)){
  sim_maxes <- unlist(lapply(dabtramtocis_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_dabtramtocis <- cbind(ttest_pval_dabtramtocis,t.test(x = unlist(lapply(dabtramtocis_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(dabtramtocis_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(dabtramtocis_lin_clust_list, dabtramtocis_lin_clust_rand_list,z_mean_dabtramtocis,pval_mean_dabtramtocis, z_wmean_dabtramtocis, ttest_pval_dabtramtocis, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/dabtramtocis_sim_results.RData')
rm(dabtramtocis)

Significance testing of the dabtramtococl2 simulation

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to dabtramtococl2
dabtramtococl2 <- subset(all_data, idents = 'dabtramtococl2') # Subset down to the dabtramtococl2 object

ElbowPlot(dabtramtococl2) # The standard deviation seems to really level off at 10


# Recluster with the appropriate number of dimensions
dabtramtococl2 <- FindNeighbors(dabtramtococl2, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
dabtramtococl2 <- FindClusters(dabtramtococl2, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 10184
Number of edges: 308721

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8258
Number of communities: 8
Elapsed time: 1 seconds
dabtramtococl2 <- RunUMAP(dabtramtococl2, dims = 1:10)
12:33:35 UMAP embedding parameters a = 0.9922 b = 1.112
12:33:35 Read 10184 rows and found 10 numeric columns
12:33:35 Using Annoy for neighbor search, n_neighbors = 30
12:33:35 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:33:36 Writing NN index file to temp file /var/folders/ph/24prrxys02179y9_qzhxjgvc0000gn/T//Rtmpryniy5/fileb7bd71153090
12:33:36 Searching Annoy index using 1 thread, search_k = 3000
12:33:39 Annoy recall = 100%
12:33:39 Commencing smooth kNN distance calibration using 1 thread
12:33:41 Initializing from normalized Laplacian + noise
12:33:41 Commencing optimization for 200 epochs, with 415696 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:33:47 Optimization finished
DimPlot(dabtramtococl2, reduction = 'umap')


# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
dabtramtococl2_lin_clust_list <- list()

for (i in fivecell_cDNA$DabTramtoCoCl2){
  temp_df <- as.data.frame(table(Idents(dabtramtococl2)[dabtramtococl2$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  dabtramtococl2_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
dabtramtococl2_lin_clust_rand_list <- list()
num_iter <- 1000 
for(j in 1:num_iter){
  set.seed(j)
  dabtramtococl2_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$DabTramtoCoCl2){
    num_cells <- length(dabtramtococl2$Lineage[dabtramtococl2$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(dabtramtococl2), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    dabtramtococl2_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Look at whether lineages cluster together in each individual condition - Starting with DabTram

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_dabtramtococl2 <- mean(unlist(lapply(dabtramtococl2_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_dabtramtococl2_sim <- sapply(1:length(dabtramtococl2_lin_clust_rand_list), function(y)
  mean(unlist(lapply(dabtramtococl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_dabtramtococl2 <- (mean_dabtramtococl2-mean(means_dabtramtococl2_sim))/sd(means_dabtramtococl2_sim)
pval_mean_dabtramtococl2 <- pnorm(z_mean_dabtramtococl2, mean(means_dabtramtococl2_sim), sd(means_dabtramtococl2_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_dabtramtococl2 <- weighted.mean(unlist(lapply(dabtramtococl2_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(dabtramtococl2_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_dabtramtococl2_sim <- sapply(1:length(dabtramtococl2_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(dabtramtococl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(dabtramtococl2_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_dabtramtococl2 <- (weighted_mean_dabtramtococl2-mean(weighted_means_dabtramtococl2_sim))/sd(weighted_means_dabtramtococl2_sim)
pval_wmean_dabtramtococl2 <- pnorm(z_wmean_dabtramtococl2, mean(weighted_means_dabtramtococl2_sim), sd(weighted_means_dabtramtococl2_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_dabtramtococl2 <- c()
for (i in 1:length(means_dabtramtococl2_sim)){
  sim_maxes <- unlist(lapply(dabtramtococl2_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_dabtramtococl2 <- cbind(ttest_pval_dabtramtococl2,t.test(x = unlist(lapply(dabtramtococl2_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(dabtramtococl2_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(dabtramtococl2_lin_clust_list, dabtramtococl2_lin_clust_rand_list,z_mean_dabtramtococl2,pval_mean_dabtramtococl2, z_wmean_dabtramtococl2, ttest_pval_dabtramtococl2, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/dabtramtococl2_sim_results.RData')
rm(dabtramtococl2)

Significance testing of the cocl2 simulation

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to cocl2
cocl2 <- subset(all_data, idents = 'cocl2') # Subset down to the cocl2 object

ElbowPlot(cocl2) # The standard deviation seems to really level off at 10


# Recluster with the appropriate number of dimensions
cocl2 <- FindNeighbors(cocl2, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
cocl2 <- FindClusters(cocl2, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 4823
Number of edges: 160093

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8374
Number of communities: 9
Elapsed time: 0 seconds
cocl2 <- RunUMAP(cocl2, dims = 1:10)
12:38:44 UMAP embedding parameters a = 0.9922 b = 1.112
12:38:44 Read 4823 rows and found 10 numeric columns
12:38:44 Using Annoy for neighbor search, n_neighbors = 30
12:38:44 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:38:44 Writing NN index file to temp file /var/folders/ph/24prrxys02179y9_qzhxjgvc0000gn/T//Rtmpryniy5/fileb7bd262777f0
12:38:44 Searching Annoy index using 1 thread, search_k = 3000
12:38:45 Annoy recall = 100%
12:38:46 Commencing smooth kNN distance calibration using 1 thread
12:38:48 Initializing from normalized Laplacian + noise
12:38:48 Commencing optimization for 500 epochs, with 195924 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:38:55 Optimization finished
DimPlot(cocl2, reduction = 'umap')


# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
cocl2_lin_clust_list <- list()

for (i in fivecell_cDNA$CoCl2){
  temp_df <- as.data.frame(table(Idents(cocl2)[cocl2$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  cocl2_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
cocl2_lin_clust_rand_list <- list()
num_iter <- 1000 
for(j in 1:num_iter){
  set.seed(j)
  cocl2_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$CoCl2){
    num_cells <- length(cocl2$Lineage[cocl2$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(cocl2), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    cocl2_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Look at whether lineages cluster together in each individual condition - Starting with CoCl2toCoCl2

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_cocl2 <- mean(unlist(lapply(cocl2_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_cocl2_sim <- sapply(1:length(cocl2_lin_clust_rand_list), function(y)
  mean(unlist(lapply(cocl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_cocl2 <- (mean_cocl2-mean(means_cocl2_sim))/sd(means_cocl2_sim)
pval_mean_cocl2 <- pnorm(z_mean_cocl2, mean(means_cocl2_sim), sd(means_cocl2_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_cocl2 <- weighted.mean(unlist(lapply(cocl2_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cocl2_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_cocl2_sim <- sapply(1:length(cocl2_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cocl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cocl2_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_cocl2 <- (weighted_mean_cocl2-mean(weighted_means_cocl2_sim))/sd(weighted_means_cocl2_sim)
pval_wmean_cocl2 <- pnorm(z_wmean_cocl2, mean(weighted_means_cocl2_sim), sd(weighted_means_cocl2_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_cocl2 <- c()
for (i in 1:length(means_cocl2_sim)){
  sim_maxes <- unlist(lapply(cocl2_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_cocl2 <- cbind(ttest_pval_cocl2,t.test(x = unlist(lapply(cocl2_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(cocl2_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(cocl2_lin_clust_list, cocl2_lin_clust_rand_list,z_mean_cocl2,pval_mean_cocl2, z_wmean_cocl2, ttest_pval_cocl2, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cocl2_sim_results.RData')
rm(cocl2)

Significance testing of the cocl2tococl2 simulation

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to cocl2tococl2
cocl2tococl2 <- subset(all_data, idents = 'cocl2tococl2') # Subset down to the cocl2tococl2 object

ElbowPlot(cocl2tococl2) # The standard deviation seems to really level off at 10


# Recluster with the appropriate number of dimensions
cocl2tococl2 <- FindNeighbors(cocl2tococl2, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
cocl2tococl2 <- FindClusters(cocl2tococl2, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 13951
Number of edges: 395318

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7954
Number of communities: 6
Elapsed time: 3 seconds
cocl2tococl2 <- RunUMAP(cocl2tococl2, dims = 1:10)
12:43:34 UMAP embedding parameters a = 0.9922 b = 1.112
12:43:34 Read 13951 rows and found 10 numeric columns
12:43:34 Using Annoy for neighbor search, n_neighbors = 30
12:43:34 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:43:35 Writing NN index file to temp file /var/folders/ph/24prrxys02179y9_qzhxjgvc0000gn/T//Rtmpryniy5/fileb7bd69334121
12:43:35 Searching Annoy index using 1 thread, search_k = 3000
12:43:40 Annoy recall = 100%
12:43:40 Commencing smooth kNN distance calibration using 1 thread
12:43:42 Initializing from normalized Laplacian + noise
12:43:42 Commencing optimization for 200 epochs, with 586158 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:43:50 Optimization finished
DimPlot(cocl2tococl2, reduction = 'umap')


# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
cocl2tococl2_lin_clust_list <- list()

for (i in fivecell_cDNA$CoCl2toCoCl2){
  temp_df <- as.data.frame(table(Idents(cocl2tococl2)[cocl2tococl2$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  cocl2tococl2_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
cocl2tococl2_lin_clust_rand_list <- list()
num_iter <- 1000 
for(j in 1:num_iter){
  set.seed(j)
  cocl2tococl2_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$CoCl2toCoCl2){
    num_cells <- length(cocl2tococl2$Lineage[cocl2tococl2$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(cocl2tococl2), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    cocl2tococl2_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Look at whether lineages cluster together in each individual condition - Starting with CoCl2toCis

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_cocl2tococl2 <- mean(unlist(lapply(cocl2tococl2_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_cocl2tococl2_sim <- sapply(1:length(cocl2tococl2_lin_clust_rand_list), function(y)
  mean(unlist(lapply(cocl2tococl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_cocl2tococl2 <- (mean_cocl2tococl2-mean(means_cocl2tococl2_sim))/sd(means_cocl2tococl2_sim)
pval_mean_cocl2tococl2 <- pnorm(z_mean_cocl2tococl2, mean(means_cocl2tococl2_sim), sd(means_cocl2tococl2_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_cocl2tococl2 <- weighted.mean(unlist(lapply(cocl2tococl2_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cocl2tococl2_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_cocl2tococl2_sim <- sapply(1:length(cocl2tococl2_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cocl2tococl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cocl2tococl2_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_cocl2tococl2 <- (weighted_mean_cocl2tococl2-mean(weighted_means_cocl2tococl2_sim))/sd(weighted_means_cocl2tococl2_sim)
pval_wmean_cocl2tococl2 <- pnorm(z_wmean_cocl2tococl2, mean(weighted_means_cocl2tococl2_sim), sd(weighted_means_cocl2tococl2_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_cocl2tococl2 <- c()
for (i in 1:length(means_cocl2tococl2_sim)){
  sim_maxes <- unlist(lapply(cocl2tococl2_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_cocl2tococl2 <- cbind(ttest_pval_cocl2tococl2,t.test(x = unlist(lapply(cocl2tococl2_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(cocl2tococl2_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(cocl2tococl2_lin_clust_list, cocl2tococl2_lin_clust_rand_list,z_mean_cocl2tococl2,pval_mean_cocl2tococl2, z_wmean_cocl2tococl2, ttest_pval_cocl2tococl2, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cocl2tococl2_sim_results.RData')
rm(cocl2tococl2)

Significance testing of the cocl2tocis simulation

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to cocl2tocis
cocl2tocis <- subset(all_data, idents = 'cocl2tocis') # Subset down to the cocl2tocis object

ElbowPlot(cocl2tocis) # The standard deviation seems to really level off at 10


# Recluster with the appropriate number of dimensions
cocl2tocis <- FindNeighbors(cocl2tocis, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
cocl2tocis <- FindClusters(cocl2tocis, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 6459
Number of edges: 218210

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8279
Number of communities: 6
Elapsed time: 0 seconds
cocl2tocis <- RunUMAP(cocl2tocis, dims = 1:10)
12:45:25 UMAP embedding parameters a = 0.9922 b = 1.112
12:45:25 Read 6459 rows and found 10 numeric columns
12:45:25 Using Annoy for neighbor search, n_neighbors = 30
12:45:25 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:45:25 Writing NN index file to temp file /var/folders/ph/24prrxys02179y9_qzhxjgvc0000gn/T//Rtmpryniy5/fileb7bd23f9137c
12:45:25 Searching Annoy index using 1 thread, search_k = 3000
12:45:27 Annoy recall = 100%
12:45:28 Commencing smooth kNN distance calibration using 1 thread
12:45:30 Initializing from normalized Laplacian + noise
12:45:30 Commencing optimization for 500 epochs, with 269134 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:45:39 Optimization finished
DimPlot(cocl2tocis, reduction = 'umap')


# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
cocl2tocis_lin_clust_list <- list()

for (i in fivecell_cDNA$CoCl2toCis){
  temp_df <- as.data.frame(table(Idents(cocl2tocis)[cocl2tocis$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  cocl2tocis_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
cocl2tocis_lin_clust_rand_list <- list()
num_iter <- 1000 
for(j in 1:num_iter){
  set.seed(j)
  cocl2tocis_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$CoCl2toCis){
    num_cells <- length(cocl2tocis$Lineage[cocl2tocis$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(cocl2tocis), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    cocl2tocis_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Look at whether lineages cluster together in each individual condition - Starting with CoCl2toDabTram

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_cocl2tocis <- mean(unlist(lapply(cocl2tocis_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_cocl2tocis_sim <- sapply(1:length(cocl2tocis_lin_clust_rand_list), function(y)
  mean(unlist(lapply(cocl2tocis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_cocl2tocis <- (mean_cocl2tocis-mean(means_cocl2tocis_sim))/sd(means_cocl2tocis_sim)
pval_mean_cocl2tocis <- pnorm(z_mean_cocl2tocis, mean(means_cocl2tocis_sim), sd(means_cocl2tocis_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_cocl2tocis <- weighted.mean(unlist(lapply(cocl2tocis_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cocl2tocis_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_cocl2tocis_sim <- sapply(1:length(cocl2tocis_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cocl2tocis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cocl2tocis_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_cocl2tocis <- (weighted_mean_cocl2tocis-mean(weighted_means_cocl2tocis_sim))/sd(weighted_means_cocl2tocis_sim)
pval_wmean_cocl2tocis <- pnorm(z_wmean_cocl2tocis, mean(weighted_means_cocl2tocis_sim), sd(weighted_means_cocl2tocis_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_cocl2tocis <- c()
for (i in 1:length(means_cocl2tocis_sim)){
  sim_maxes <- unlist(lapply(cocl2tocis_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_cocl2tocis <- cbind(ttest_pval_cocl2tocis,t.test(x = unlist(lapply(cocl2tocis_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(cocl2tocis_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(cocl2tocis_lin_clust_list, cocl2tocis_lin_clust_rand_list,z_mean_cocl2tocis,pval_mean_cocl2tocis, z_wmean_cocl2tocis, ttest_pval_cocl2tocis, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cocl2tocis_sim_results.RData')
rm(cocl2tocis)

Significance testing of the cocl2todabtram simulation

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to cocl2todabtram
cocl2todabtram <- subset(all_data, idents = 'cocl2todabtram') # Subset down to the cocl2todabtram object

ElbowPlot(cocl2todabtram) # The standard deviation seems to really level off at 10


# Recluster with the appropriate number of dimensions
cocl2todabtram <- FindNeighbors(cocl2todabtram, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
cocl2todabtram <- FindClusters(cocl2todabtram, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 1773
Number of edges: 56087

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8495
Number of communities: 7
Elapsed time: 0 seconds
cocl2todabtram <- RunUMAP(cocl2todabtram, dims = 1:10)
12:50:32 UMAP embedding parameters a = 0.9922 b = 1.112
12:50:32 Read 1773 rows and found 10 numeric columns
12:50:32 Using Annoy for neighbor search, n_neighbors = 30
12:50:32 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:50:33 Writing NN index file to temp file /var/folders/ph/24prrxys02179y9_qzhxjgvc0000gn/T//Rtmpryniy5/fileb7bd356e4457
12:50:33 Searching Annoy index using 1 thread, search_k = 3000
12:50:33 Annoy recall = 100%
12:50:34 Commencing smooth kNN distance calibration using 1 thread
12:50:36 Initializing from normalized Laplacian + noise
12:50:36 Commencing optimization for 500 epochs, with 72086 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:50:39 Optimization finished
DimPlot(cocl2todabtram, reduction = 'umap')


# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
cocl2todabtram_lin_clust_list <- list()

for (i in fivecell_cDNA$CoCl2toDabTram){
  temp_df <- as.data.frame(table(Idents(cocl2todabtram)[cocl2todabtram$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  cocl2todabtram_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
cocl2todabtram_lin_clust_rand_list <- list()
num_iter <- 1000 
for(j in 1:num_iter){
  set.seed(j)
  cocl2todabtram_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$CoCl2toDabTram){
    num_cells <- length(cocl2todabtram$Lineage[cocl2todabtram$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(cocl2todabtram), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    cocl2todabtram_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Look at whether lineages cluster together in each individual condition - Starting with Cis

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_cocl2todabtram <- mean(unlist(lapply(cocl2todabtram_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_cocl2todabtram_sim <- sapply(1:length(cocl2todabtram_lin_clust_rand_list), function(y)
  mean(unlist(lapply(cocl2todabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_cocl2todabtram <- (mean_cocl2todabtram-mean(means_cocl2todabtram_sim))/sd(means_cocl2todabtram_sim)
pval_mean_cocl2todabtram <- pnorm(z_mean_cocl2todabtram, mean(means_cocl2todabtram_sim), sd(means_cocl2todabtram_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_cocl2todabtram <- weighted.mean(unlist(lapply(cocl2todabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cocl2todabtram_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_cocl2todabtram_sim <- sapply(1:length(cocl2todabtram_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cocl2todabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cocl2todabtram_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_cocl2todabtram <- (weighted_mean_cocl2todabtram-mean(weighted_means_cocl2todabtram_sim))/sd(weighted_means_cocl2todabtram_sim)
pval_wmean_cocl2todabtram <- pnorm(z_wmean_cocl2todabtram, mean(weighted_means_cocl2todabtram_sim), sd(weighted_means_cocl2todabtram_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_cocl2todabtram <- c()
for (i in 1:length(means_cocl2todabtram_sim)){
  sim_maxes <- unlist(lapply(cocl2todabtram_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_cocl2todabtram <- cbind(ttest_pval_cocl2todabtram,t.test(x = unlist(lapply(cocl2todabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(cocl2todabtram_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(cocl2todabtram_lin_clust_list, cocl2todabtram_lin_clust_rand_list,z_mean_cocl2todabtram,pval_mean_cocl2todabtram, z_wmean_cocl2todabtram, ttest_pval_cocl2todabtram, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cocl2todabtram_sim_results.RData')
rm(cocl2todabtram)

Significance testing of the cis simulation

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to cis
cis <- subset(all_data, idents = 'cis') # Subset down to the cis object

ElbowPlot(cis) # The standard deviation seems to really level off at 10


# Recluster with the appropriate number of dimensions
cis <- FindNeighbors(cis, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
cis <- FindClusters(cis, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 8303
Number of edges: 244918

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8046
Number of communities: 8
Elapsed time: 1 seconds
cis <- RunUMAP(cis, dims = 1:10)
12:52:37 UMAP embedding parameters a = 0.9922 b = 1.112
12:52:37 Read 8303 rows and found 10 numeric columns
12:52:37 Using Annoy for neighbor search, n_neighbors = 30
12:52:37 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:52:38 Writing NN index file to temp file /var/folders/ph/24prrxys02179y9_qzhxjgvc0000gn/T//Rtmpryniy5/fileb7bd5a48c728
12:52:38 Searching Annoy index using 1 thread, search_k = 3000
12:52:41 Annoy recall = 100%
12:52:42 Commencing smooth kNN distance calibration using 1 thread
12:52:43 Initializing from normalized Laplacian + noise
12:52:44 Commencing optimization for 500 epochs, with 350988 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:52:55 Optimization finished
DimPlot(cis, reduction = 'umap')


# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
cis_lin_clust_list <- list()

for (i in fivecell_cDNA$Cis){
  temp_df <- as.data.frame(table(Idents(cis)[cis$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  cis_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
cis_lin_clust_rand_list <- list()
num_iter <- 1000 
for(j in 1:num_iter){
  set.seed(j)
  cis_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$Cis){
    num_cells <- length(cis$Lineage[cis$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(cis), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    cis_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Look at whether lineages cluster together in each individual condition - Starting with cistocis

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_cis <- mean(unlist(lapply(cis_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_cis_sim <- sapply(1:length(cis_lin_clust_rand_list), function(y)
  mean(unlist(lapply(cis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_cis <- (mean_cis-mean(means_cis_sim))/sd(means_cis_sim)
pval_mean_cis <- pnorm(z_mean_cis, mean(means_cis_sim), sd(means_cis_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_cis <- weighted.mean(unlist(lapply(cis_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cis_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_cis_sim <- sapply(1:length(cis_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cis_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_cis <- (weighted_mean_cis-mean(weighted_means_cis_sim))/sd(weighted_means_cis_sim)
pval_wmean_cis <- pnorm(z_wmean_cis, mean(weighted_means_cis_sim), sd(weighted_means_cis_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_cis <- c()
for (i in 1:length(means_cis_sim)){
  sim_maxes <- unlist(lapply(cis_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_cis <- cbind(ttest_pval_cis,t.test(x = unlist(lapply(cis_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(cis_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(cis_lin_clust_list, cis_lin_clust_rand_list,z_mean_cis,pval_mean_cis, z_wmean_cis, ttest_pval_cis, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cis_sim_results.RData')
rm(cis)

Significance testing of the cistocis simulation

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to cistocis
cistocis <- subset(all_data, idents = 'cistocis') # Subset down to the cistocis object

ElbowPlot(cistocis) # The standard deviation seems to really level off at 10


# Recluster with the appropriate number of dimensions
cistocis <- FindNeighbors(cistocis, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
cistocis <- FindClusters(cistocis, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 3323
Number of edges: 114057

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8412
Number of communities: 9
Elapsed time: 0 seconds
cistocis <- RunUMAP(cistocis, dims = 1:10)
12:58:20 UMAP embedding parameters a = 0.9922 b = 1.112
12:58:20 Read 3323 rows and found 10 numeric columns
12:58:20 Using Annoy for neighbor search, n_neighbors = 30
12:58:20 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:58:21 Writing NN index file to temp file /var/folders/ph/24prrxys02179y9_qzhxjgvc0000gn/T//Rtmpryniy5/fileb7bd600b4166
12:58:21 Searching Annoy index using 1 thread, search_k = 3000
12:58:21 Annoy recall = 100%
12:58:22 Commencing smooth kNN distance calibration using 1 thread
12:58:25 Initializing from normalized Laplacian + noise
12:58:25 Commencing optimization for 500 epochs, with 136790 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:58:30 Optimization finished
DimPlot(cistocis, reduction = 'umap')


# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
cistocis_lin_clust_list <- list()

for (i in fivecell_cDNA$CistoCis){
  temp_df <- as.data.frame(table(Idents(cistocis)[cistocis$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  cistocis_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
cistocis_lin_clust_rand_list <- list()
num_iter <- 1000 
for(j in 1:num_iter){
  set.seed(j)
  cistocis_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$CistoCis){
    num_cells <- length(cistocis$Lineage[cistocis$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(cistocis), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    cistocis_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Look at whether lineages cluster together in each individual condition - Starting with cistodabtram

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_cistocis <- mean(unlist(lapply(cistocis_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_cistocis_sim <- sapply(1:length(cistocis_lin_clust_rand_list), function(y)
  mean(unlist(lapply(cistocis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_cistocis <- (mean_cistocis-mean(means_cistocis_sim))/sd(means_cistocis_sim)
pval_mean_cistocis <- pnorm(z_mean_cistocis, mean(means_cistocis_sim), sd(means_cistocis_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_cistocis <- weighted.mean(unlist(lapply(cistocis_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cistocis_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_cistocis_sim <- sapply(1:length(cistocis_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cistocis_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cistocis_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_cistocis <- (weighted_mean_cistocis-mean(weighted_means_cistocis_sim))/sd(weighted_means_cistocis_sim)
pval_wmean_cistocis <- pnorm(z_wmean_cistocis, mean(weighted_means_cistocis_sim), sd(weighted_means_cistocis_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_cistocis <- c()
for (i in 1:length(means_cistocis_sim)){
  sim_maxes <- unlist(lapply(cistocis_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_cistocis <- cbind(ttest_pval_cistocis,t.test(x = unlist(lapply(cistocis_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(cistocis_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(cistocis_lin_clust_list, cistocis_lin_clust_rand_list,z_mean_cistocis,pval_mean_cistocis, z_wmean_cistocis, ttest_pval_cistocis, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cistocis_sim_results.RData')
rm(cistocis)

Significance testing of the cistodabtram simulation

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to cistodabtram
cistodabtram <- subset(all_data, idents = 'cistodabtram') # Subset down to the cistodabtram object

ElbowPlot(cistodabtram) # The standard deviation seems to really level off at 10


# Recluster with the appropriate number of dimensions
cistodabtram <- FindNeighbors(cistodabtram, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
cistodabtram <- FindClusters(cistodabtram, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 2615
Number of edges: 86990

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8655
Number of communities: 8
Elapsed time: 0 seconds
cistodabtram <- RunUMAP(cistodabtram, dims = 1:10)
12:59:48 UMAP embedding parameters a = 0.9922 b = 1.112
12:59:48 Read 2615 rows and found 10 numeric columns
12:59:48 Using Annoy for neighbor search, n_neighbors = 30
12:59:48 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:59:48 Writing NN index file to temp file /var/folders/ph/24prrxys02179y9_qzhxjgvc0000gn/T//Rtmpryniy5/fileb7bd2f2c0cd
12:59:48 Searching Annoy index using 1 thread, search_k = 3000
12:59:49 Annoy recall = 100%
12:59:50 Commencing smooth kNN distance calibration using 1 thread
12:59:52 Initializing from normalized Laplacian + noise
12:59:52 Commencing optimization for 500 epochs, with 106198 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
12:59:57 Optimization finished
DimPlot(cistodabtram, reduction = 'umap')


# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
cistodabtram_lin_clust_list <- list()

for (i in fivecell_cDNA$CistoDabTram){
  temp_df <- as.data.frame(table(Idents(cistodabtram)[cistodabtram$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  cistodabtram_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
cistodabtram_lin_clust_rand_list <- list()
num_iter <- 1000 
for(j in 1:num_iter){
  set.seed(j)
  cistodabtram_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$CistoDabTram){
    num_cells <- length(cistodabtram$Lineage[cistodabtram$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(cistodabtram), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    cistodabtram_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Look at whether lineages cluster together in each individual condition - Starting with cistococl2

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_cistodabtram <- mean(unlist(lapply(cistodabtram_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_cistodabtram_sim <- sapply(1:length(cistodabtram_lin_clust_rand_list), function(y)
  mean(unlist(lapply(cistodabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_cistodabtram <- (mean_cistodabtram-mean(means_cistodabtram_sim))/sd(means_cistodabtram_sim)
pval_mean_cistodabtram <- pnorm(z_mean_cistodabtram, mean(means_cistodabtram_sim), sd(means_cistodabtram_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_cistodabtram <- weighted.mean(unlist(lapply(cistodabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cistodabtram_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_cistodabtram_sim <- sapply(1:length(cistodabtram_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cistodabtram_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cistodabtram_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_cistodabtram <- (weighted_mean_cistodabtram-mean(weighted_means_cistodabtram_sim))/sd(weighted_means_cistodabtram_sim)
pval_wmean_cistodabtram <- pnorm(z_wmean_cistodabtram, mean(weighted_means_cistodabtram_sim), sd(weighted_means_cistodabtram_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_cistodabtram <- c()
for (i in 1:length(means_cistodabtram_sim)){
  sim_maxes <- unlist(lapply(cistodabtram_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_cistodabtram <- cbind(ttest_pval_cistodabtram,t.test(x = unlist(lapply(cistodabtram_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(cistodabtram_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(cistodabtram_lin_clust_list, cistodabtram_lin_clust_rand_list,z_mean_cistodabtram,pval_mean_cistodabtram, z_wmean_cistodabtram, ttest_pval_cistodabtram, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cistodabtram_sim_results.RData')
rm(cistodabtram)

Significance testing of the cistococl2 simulation

Idents(all_data) <- all_data$OG_condition # Change the idents to the OG condition for subsetting to cistococl2
cistococl2 <- subset(all_data, idents = 'cistococl2') # Subset down to the cistococl2 object

ElbowPlot(cistococl2) # The standard deviation seems to really level off at 10


# Recluster with the appropriate number of dimensions
cistococl2 <- FindNeighbors(cistococl2, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
cistococl2 <- FindClusters(cistococl2, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 5715
Number of edges: 185463

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8313
Number of communities: 7
Elapsed time: 0 seconds
cistococl2 <- RunUMAP(cistococl2, dims = 1:10)
13:01:13 UMAP embedding parameters a = 0.9922 b = 1.112
13:01:13 Read 5715 rows and found 10 numeric columns
13:01:13 Using Annoy for neighbor search, n_neighbors = 30
13:01:13 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
13:01:14 Writing NN index file to temp file /var/folders/ph/24prrxys02179y9_qzhxjgvc0000gn/T//Rtmpryniy5/fileb7bdf4fd43e
13:01:14 Searching Annoy index using 1 thread, search_k = 3000
13:01:15 Annoy recall = 100%
13:01:16 Commencing smooth kNN distance calibration using 1 thread
13:01:18 Initializing from normalized Laplacian + noise
13:01:18 Commencing optimization for 500 epochs, with 232812 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
13:01:27 Optimization finished
DimPlot(cistococl2, reduction = 'umap')


# Build list of lineages with at least 5 cells in dab tram and check what seurat cluster the cells are in 
cistococl2_lin_clust_list <- list()

for (i in fivecell_cDNA$CistoCoCl2){
  temp_df <- as.data.frame(table(Idents(cistococl2)[cistococl2$Lineage == i]))
  colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
  temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
  cistococl2_lin_clust_list[[i]] <- temp_df
}

# Need to do a random sampling of the same thing 
cistococl2_lin_clust_rand_list <- list()
num_iter <- 1000 
for(j in 1:num_iter){
  set.seed(j)
  cistococl2_lin_clust_rand_list[[j]] <- list()
  for (i in fivecell_cDNA$CistoCoCl2){
    num_cells <- length(cistococl2$Lineage[cistococl2$Lineage == i])
    temp_df <- as.data.frame(table(sample(Idents(cistococl2), num_cells, replace = F)))
    colnames(temp_df) <- c('Seurat_clust', 'Num_cells')
    temp_df$Pcnt_cells <- temp_df$Num_cells/sum(temp_df$Num_cells)
    cistococl2_lin_clust_rand_list[[j]][[i]] <- temp_df
  }
}

Build dataframe of overall simulation results

# Find the mean of the maximum percentage of cells in a single cluster per lineage in each simulation
mean_cistococl2 <- mean(unlist(lapply(cistococl2_lin_clust_list, function(x) max(x$Pcnt_cells))))
means_cistococl2_sim <- sapply(1:length(cistococl2_lin_clust_rand_list), function(y)
  mean(unlist(lapply(cistococl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells)))))
z_mean_cistococl2 <- (mean_cistococl2-mean(means_cistococl2_sim))/sd(means_cistococl2_sim)
pval_mean_cistococl2 <- pnorm(z_mean_cistococl2, mean(means_cistococl2_sim), sd(means_cistococl2_sim), lower.tail = F)

# Find the weighted mean of the maximum percentage of cells in a single cluster per lineage in each simulation
weighted_mean_cistococl2 <- weighted.mean(unlist(lapply(cistococl2_lin_clust_list, function(x) max(x$Pcnt_cells))),
unlist(lapply(cistococl2_lin_clust_list, function(x) sum(x$Num_cells))))
weighted_means_cistococl2_sim <- sapply(1:length(cistococl2_lin_clust_rand_list), function(y)
  weighted.mean(unlist(lapply(cistococl2_lin_clust_rand_list[[y]], function(x) max(x$Pcnt_cells))),
                unlist(lapply(cistococl2_lin_clust_rand_list[[y]], function(x) sum(x$Num_cells)))))
z_wmean_cistococl2 <- (weighted_mean_cistococl2-mean(weighted_means_cistococl2_sim))/sd(weighted_means_cistococl2_sim)
pval_wmean_cistococl2 <- pnorm(z_wmean_cistococl2, mean(weighted_means_cistococl2_sim), sd(weighted_means_cistococl2_sim), lower.tail = F)

# Compare each individual distribution of maxes to the observed max by t test and track pval
ttest_pval_cistococl2 <- c()
for (i in 1:length(means_cistococl2_sim)){
  sim_maxes <- unlist(lapply(cistococl2_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells)))
  ttest_pval_cistococl2 <- cbind(ttest_pval_cistococl2,t.test(x = unlist(lapply(cistococl2_lin_clust_list, function(x) max(x$Pcnt_cells))),y = unlist(lapply(cistococl2_lin_clust_rand_list[[i]], function(x) max(x$Pcnt_cells))), alternative = 'greater')$p.value)
}

# Save outputs
save(cistococl2_lin_clust_list, cistococl2_lin_clust_rand_list,z_mean_cistococl2,pval_mean_cistococl2, z_wmean_cistococl2, ttest_pval_cistococl2, file = '2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/cistococl2_sim_results.RData')
rm(cistococl2)
LS0tCnRpdGxlOiAiTGluZWFnZSBleHByZXNzaW9uIG92ZXIgdGltZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKI1NldCB3b3JraW5nIGRpcmVjdG9yeSB0byBhcHByb3ByaWF0ZSBmb2xkZXIgZm9yIGlucHV0cyBhbmQgb3V0cHV0cyBvbiBHb29nbGUgRHJpdmUKYGBge3IsIHNldHVwLCBpbmNsdWRlPUZBTFNFfQoja25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAnL1ZvbHVtZXMvR29vZ2xlRHJpdmUvTXkgRHJpdmUvRmFzc2VfU2hhcmVkL0FKRl9Ecml2ZV9jb3B5L0V4cGVyaW1lbnRzL0FKRjAwOScpICMgZm9yIGFyaWEncyBjb21wdXRlcgprbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICcvVm9sdW1lcy9Hb29nbGVEcml2ZS8uc2hvcnRjdXQtdGFyZ2V0cy1ieS1pZC8xelNxeDNJelhNd3Q2Y2xVand5cW1sT2Y0RzFLNTNsdnkvRmFzc2VfU2hhcmVkL0FKRl9Ecml2ZV9jb3B5L0V4cGVyaW1lbnRzL0FKRjAwOScpICMgZm9yIGR5bGFuJ3MgY29tcHV0ZXIKCiMyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vIGlzIGFkZGl0aW9uYWwgcGF0aCBmb3Igb3V0cHV0cwoKYGBgCgojSW5pdGlhbGl6ZQpgYGB7ciBpbmNsdWRlID0gRkFMU0V9CnJtKGxpc3QgPSBscygpKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShnZ3B1YnIpCgpgJW5pbiVgID0gTmVnYXRlKGAlaW4lYCkKYGBgCgojIExvYWQgZGF0YQpgYGB7cn0KbG9hZCgnMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvQXNzaWduX2RvbWluYW50X2JhcmNvZGVzL2FsbF9kYXRhX2ZpbmFsX2xpbmVhZ2VzLlJEYXRhJykKbG9hZCgnMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvUHJlcHJvY2Vzc19HRVgvc2Vjb25kX3RpbWVwb2ludF9tZXJnZWQuUkRhdGEnKQpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9GaWx0ZXJpbmdfY0ROQS9yZXNpc3RhbnRfbGluZWFnZV9saXN0cy5SRGF0YScpCgpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9Bc3NpZ25fZG9taW5hbnRfYmFyY29kZXMvY2lzX2ZpbmFsX2xpbmVhZ2VzLlJEYXRhJykKbG9hZCgnMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvQXNzaWduX2RvbWluYW50X2JhcmNvZGVzL2NvY2wyX2ZpbmFsX2xpbmVhZ2VzLlJEYXRhJykKbG9hZCgnMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvQXNzaWduX2RvbWluYW50X2JhcmNvZGVzL2RhYnRyYW1fZmluYWxfbGluZWFnZXMuUkRhdGEnKQpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9Bc3NpZ25fZG9taW5hbnRfYmFyY29kZXMvZGFidHJhbV9ib3RoX3RpbWVzX2ZpbmFsX2xpbmVhZ2VzLlJEYXRhJykKCmBgYAoKI1Bsb3QgY2VsbCBjeWNsZQpgYGB7cn0KCiMgdmlldyBjZWxsIGN5Y2xlIHNjb3JlcyBhbmQgcGhhc2UgYXNzaWdubWVudHMKRGltUGxvdChhbGxfZGF0YSwgZ3JvdXAuYnkgPSAiUGhhc2UiKQpEaW1QbG90KGFsbF9kYXRhKQpGZWF0dXJlUGxvdChvYmplY3QgPSBhbGxfZGF0YSwgcmVkdWN0aW9uID0gJ3VtYXAnLCBmZWF0dXJlcyA9ICgibkZlYXR1cmVfUk5BIiksIHB0LnNpemUgPSAxLCBjb21iaW5lID0gVCwgb3JkZXIgPSBUUlVFKQpEaW1QbG90KGFsbF9kYXRhLCBncm91cC5ieSA9ICJPR19jb25kaXRpb24iLCBjb2xzID0gYygnZGFidHJhbScgPSAnIzYyMzU5NCcsICdjb2NsMicgPSAnIzBGODI0MScsICdjaXMnID0gJyNDOTZEMjknLCAnZGFidHJhbXRvZGFidHJhbScgPSAnIzU2MUU1OScsICdkYWJ0cmFtdG9jb2NsMicgPSAnI0EyMjQ4RScsICdkYWJ0cmFtdG9jaXMnID0gJyM5RDg1QkUnLCAnY29jbDJ0b2RhYnRyYW0nID0gJyMxMDQxM0InLCAnY29jbDJ0b2NvY2wyJyA9ICcjNkFCRDQ1JywgJ2NvY2wydG9jaXMnID0gJyM2REM0OUMnLCAnY2lzdG9kYWJ0cmFtJyA9ICcjQTIzNjIyJywgJ2Npc3RvY29jbDInID0gJyNGNDkxMjknLCAnY2lzdG9jaXMnID0gJyNGQkQwOEMnKSkKCmBgYAoKIyBNYXJrZXJzIHdpdGhpbiBlYWNoIGZpcnN0IGRydWcgb2JqZWN0IHRvIGZpbmQgc3ViZ3JvdXBzIChpZSBhbmFsb2dvdXMgdG8gTkdGUi9FR0ZSKQpgYGB7ciBpbmNsdWRlID0gRkFMU0V9CiNsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vYWxsX2RhdGFfbWFya2Vycy5SRGF0YScpCmNpc19tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKGNpcywgb25seS5wb3MgPSBUUlVFLCBtaW4ucGN0ID0gMC4yNSwgbG9nZmMudGhyZXNob2xkID0gMC4yNSkKY29jbDJfbWFya2VycyA8LSBGaW5kQWxsTWFya2Vycyhjb2NsMiwgb25seS5wb3MgPSBUUlVFLCBtaW4ucGN0ID0gMC4yNSwgbG9nZmMudGhyZXNob2xkID0gMC4yNSkKZGFidHJhbV9tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKGRhYnRyYW0sIG9ubHkucG9zID0gVFJVRSwgbWluLnBjdCA9IDAuMjUsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMjUpCgphbGxfZGF0YS5tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKGFsbF9kYXRhLCBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCBsb2dmYy50aHJlc2hvbGQgPSAwLjI1KSAKc2F2ZShhbGxfZGF0YS5tYXJrZXJzLCBjaXNfbWFya2VycywgY29jbDJfbWFya2VycywgZGFidHJhbV9tYXJrZXJzLCBmaWxlID0gJ2FsbF9kYXRhX21hcmtlcnMuUkRhdGEnKQpgYGAKCiMgbmVlZCB0byBtYWtlIElkZW50cyBtZXRhZGF0YSBvYmplY3Qgd2hpY2ggc2F5cyBpZiB0aGUgY2VsbHMgYXJlIGluY2x1ZGVkIGluIHRoZSBjb21iaW5lZCBsaW5zIGxpc3QsIG9yIGlmIHRoZXkgd2VyZSBmaWx0ZXJlZApgYGB7cn0KI2ZpbmQgbGluZWFnZXMgdGhhdCBhcmUgbWFpbnRhaW5lZCBhdCBib3RoIGRhYnRyYW0gdGltZXBvaW50cwpmaXZlY2VsbF9jRE5BJERhYlRyYW1NYWludGFpbmVkIDwtIFJlZHVjZShpbnRlcnNlY3QsIGxpc3QoZml2ZWNlbGxfY0ROQSREYWJUcmFtLCBmaXZlY2VsbF9jRE5BJERhYlRyYW10b0RhYlRyYW0pKQoKZmlsdGVyZWRfbWV0YSA8LSByZXAoMCwgbGVuZ3RoKG5hbWVzKGFsbF9kYXRhJExpbmVhZ2UpKSkKCiNzcGVjaWZ5IHdoaWNoIGNlbGxzIGFyZSBpbiBsaW5lYWdlcyB0aGF0IHBhc3MgZmlsdGVyaW5nIGZvciB0aGF0IGNvbmRpdGlvbgpmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiZGFidHJhbSIgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgY29tYmluZWRfbGluc19saXN0JERhYlRyYW0pXSA8LSAnUmVzaXN0YW50IHRvIERhYlRyYW0nCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJkYWJ0cmFtdG9kYWJ0cmFtIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBjb21iaW5lZF9saW5zX2xpc3QkRGFiVHJhbXRvRGFiVHJhbSldIDwtICdSZXNpc3RhbnQgdG8gRGFiVHJhbXRvRGFiVHJhbScKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImRhYnRyYW10b2NvY2wyIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBjb21iaW5lZF9saW5zX2xpc3QkRGFiVHJhbXRvQ29DbDIpXSA8LSAnUmVzaXN0YW50IHRvIERhYlRyYW10b0NvQ2wyJwpmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiZGFidHJhbXRvY2lzIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBjb21iaW5lZF9saW5zX2xpc3QkRGFiVHJhbXRvQ2lzKV0gPC0gJ1Jlc2lzdGFudCB0byBEYWJUcmFtdG9DaXMnCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjb2NsMiIgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgY29tYmluZWRfbGluc19saXN0JENvQ2wyKV0gPC0gJ1Jlc2lzdGFudCB0byBDb0NsMicKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wydG9kYWJ0cmFtIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBjb21iaW5lZF9saW5zX2xpc3QkQ29DbDJ0b0RhYlRyYW0pXSA8LSAnUmVzaXN0YW50IHRvIENvQ2wydG9EYWJUcmFtJwpmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiY29jbDJ0b2NvY2wyIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBjb21iaW5lZF9saW5zX2xpc3QkQ29DbDJ0b0NvQ2wyKV0gPC0gJ1Jlc2lzdGFudCB0byBDb0NsMnRvQ29DbDInCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjb2NsMnRvY2lzIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBjb21iaW5lZF9saW5zX2xpc3QkQ29DbDJ0b0NpcyldIDwtICdSZXNpc3RhbnQgdG8gQ29DbDJ0b0NpcycKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNpcyIgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgY29tYmluZWRfbGluc19saXN0JENpcyldIDwtICdSZXNpc3RhbnQgdG8gQ2lzJwpmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiY2lzdG9kYWJ0cmFtIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBjb21iaW5lZF9saW5zX2xpc3QkQ2lzdG9EYWJUcmFtKV0gPC0gJ1Jlc2lzdGFudCB0byBDaXN0b0RhYlRyYW0nCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjaXN0b2NvY2wyIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBjb21iaW5lZF9saW5zX2xpc3QkQ2lzdG9Db0NsMildIDwtICdSZXNpc3RhbnQgdG8gQ2lzdG9Db0NsMicKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNpc3RvY2lzIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBjb21iaW5lZF9saW5zX2xpc3QkQ2lzdG9DaXMpXSA8LSAnUmVzaXN0YW50IHRvIENpc3RvQ2lzJwoKI3NwZWNpZnkgd2hpY2ggY2VsbHMgYXJlIGluIGxpbmVhZ2VzIG9mIG1vcmUgdGhhbiA1IGNlbGxzCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJkYWJ0cmFtIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBmaXZlY2VsbF9jRE5BJERhYlRyYW0pXSA8LSAnTGFyZ2UgUmVzaXN0YW50IHRvIERhYlRyYW0nCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJkYWJ0cmFtdG9kYWJ0cmFtIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBmaXZlY2VsbF9jRE5BJERhYlRyYW10b0RhYlRyYW0pXSA8LSAnTGFyZ2UgUmVzaXN0YW50IHRvIERhYlRyYW10b0RhYlRyYW0nCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJkYWJ0cmFtdG9jb2NsMiIgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgZml2ZWNlbGxfY0ROQSREYWJUcmFtdG9Db0NsMildIDwtICdMYXJnZSBSZXNpc3RhbnQgdG8gRGFiVHJhbXRvQ29DbDInCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJkYWJ0cmFtdG9jaXMiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGZpdmVjZWxsX2NETkEkRGFiVHJhbXRvQ2lzKV0gPC0gJ0xhcmdlIFJlc2lzdGFudCB0byBEYWJUcmFtdG9DaXMnCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjb2NsMiIgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgZml2ZWNlbGxfY0ROQSRDb0NsMildIDwtICdMYXJnZSBSZXNpc3RhbnQgdG8gQ29DbDInCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjb2NsMnRvZGFidHJhbSIgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgZml2ZWNlbGxfY0ROQSRDb0NsMnRvRGFiVHJhbSldIDwtICdMYXJnZSBSZXNpc3RhbnQgdG8gQ29DbDJ0b0RhYlRyYW0nCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjb2NsMnRvY29jbDIiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGZpdmVjZWxsX2NETkEkQ29DbDJ0b0NvQ2wyKV0gPC0gJ0xhcmdlIFJlc2lzdGFudCB0byBDb0NsMnRvQ29DbDInCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjb2NsMnRvY2lzIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBmaXZlY2VsbF9jRE5BJENvQ2wydG9DaXMpXSA8LSAnTGFyZ2UgUmVzaXN0YW50IHRvIENvQ2wydG9DaXMnCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjaXMiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGZpdmVjZWxsX2NETkEkQ2lzKV0gPC0gJ0xhcmdlIFJlc2lzdGFudCB0byBDaXMnCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjaXN0b2RhYnRyYW0iICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGZpdmVjZWxsX2NETkEkQ2lzdG9EYWJUcmFtKV0gPC0gJ0xhcmdlIFJlc2lzdGFudCB0byBDaXN0b0RhYlRyYW0nCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjaXN0b2NvY2wyIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBmaXZlY2VsbF9jRE5BJENpc3RvQ29DbDIpXSA8LSAnTGFyZ2UgUmVzaXN0YW50IHRvIENpc3RvQ29DbDInCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjaXN0b2NpcyIgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgZml2ZWNlbGxfY0ROQSRDaXN0b0NpcyldIDwtICdMYXJnZSBSZXNpc3RhbnQgdG8gQ2lzdG9DaXMnCgojIGZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJkYWJ0cmFtIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBmaXZlY2VsbF9jRE5BJERhYlRyYW1NYWludGFpbmVkKV0gPC0gJ01haW50YWluZWQgUmVzaXN0YW50IHRvIERhYlRyYW0nCiMgZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImRhYnRyYW10b2RhYnRyYW0iICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGZpdmVjZWxsX2NETkEkRGFiVHJhbU1haW50YWluZWQpXSA8LSAnTWFpbnRhaW5lZCBSZXNpc3RhbnQgdG8gRGFiVHJhbXRvRGFiVHJhbScKCiNzcGVjaWZ5IHdoaWNoIGNlbGxzIGFyZSBpbiBsaW5lYWdlcyB0aGF0IGRpZCBub3QgcGFzcyBmaWx0ZXJpbmcKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImRhYnRyYW0iICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjb21iaW5lZF9saW5zX2xpc3QkRGFiVHJhbSAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgYygiTm8gQmFyY29kZSIsICJTdGlsbCBtdWx0aXBsZSIpKV0gPC0gJ0ZpbHRlcmVkIG91dCcgCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJkYWJ0cmFtdG9kYWJ0cmFtIiAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgY29tYmluZWRfbGluc19saXN0JERhYlRyYW10b0RhYlRyYW0gJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGMoIk5vIEJhcmNvZGUiLCAiU3RpbGwgbXVsdGlwbGUiKSldIDwtICdGaWx0ZXJlZCBvdXQnIApmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiZGFidHJhbXRvY29jbDIiICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjb21iaW5lZF9saW5zX2xpc3QkRGFiVHJhbXRvQ29DbDIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGMoIk5vIEJhcmNvZGUiLCAiU3RpbGwgbXVsdGlwbGUiKSldIDwtICdGaWx0ZXJlZCBvdXQnIApmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiZGFidHJhbXRvY2lzIiAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgY29tYmluZWRfbGluc19saXN0JERhYlRyYW10b0NpcyAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgYygiTm8gQmFyY29kZSIsICJTdGlsbCBtdWx0aXBsZSIpKV0gPC0gJ0ZpbHRlcmVkIG91dCcgCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjb2NsMiIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDb0NsMiAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgYygiTm8gQmFyY29kZSIsICJTdGlsbCBtdWx0aXBsZSIpKV0gPC0gJ0ZpbHRlcmVkIG91dCcgCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjb2NsMnRvZGFidHJhbSIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDb0NsMnRvRGFiVHJhbSAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgYygiTm8gQmFyY29kZSIsICJTdGlsbCBtdWx0aXBsZSIpKV0gPC0gJ0ZpbHRlcmVkIG91dCcgCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjb2NsMnRvY29jbDIiICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjb21iaW5lZF9saW5zX2xpc3QkQ29DbDJ0b0NvQ2wyICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjKCJObyBCYXJjb2RlIiwgIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnRmlsdGVyZWQgb3V0JyAKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wydG9jaXMiICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjb21iaW5lZF9saW5zX2xpc3QkQ29DbDJ0b0NpcyAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgYygiTm8gQmFyY29kZSIsICJTdGlsbCBtdWx0aXBsZSIpKV0gPC0gJ0ZpbHRlcmVkIG91dCcgCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjaXMiICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjb21iaW5lZF9saW5zX2xpc3QkQ2lzICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjKCJObyBCYXJjb2RlIiwgIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnRmlsdGVyZWQgb3V0JyAKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNpc3RvZGFidHJhbSIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDaXN0b0RhYlRyYW0gJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGMoIk5vIEJhcmNvZGUiLCAiU3RpbGwgbXVsdGlwbGUiKSldIDwtICdGaWx0ZXJlZCBvdXQnIApmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiY2lzdG9jb2NsMiIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDaXN0b0NvQ2wyICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjKCJObyBCYXJjb2RlIiwgIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnRmlsdGVyZWQgb3V0JyAKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNpc3RvY2lzIiAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgY29tYmluZWRfbGluc19saXN0JENpc3RvQ2lzICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjKCJObyBCYXJjb2RlIiwgIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnRmlsdGVyZWQgb3V0JyAKCiNzcGVjaWZ5IHdoaWNoIGNlbGxzIGhhZCB6ZXJvIG9yIG11bHRpcGxlIGJhcmNvZGVzCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkTGluZWFnZSAlaW4lIGMoIk5vIEJhcmNvZGUiLCAiU3RpbGwgbXVsdGlwbGUiKSldIDwtICdObyBCYXJjb2RlJwoKcHJpbnQodGFibGUoZmlsdGVyZWRfbWV0YSkpCgpgYGAKCmBgYHtyfQphbGxfZGF0YSRSZXNpc3RhbnRfZmlsdGVyZWQgPC0gZmlsdGVyZWRfbWV0YQpJZGVudHMoYWxsX2RhdGEpIDwtIGFsbF9kYXRhJFJlc2lzdGFudF9maWx0ZXJlZApgYGAKCmBgYHtyfQpwZGYoJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi90ZXN0X3Bsb3QucGRmJywgaGVpZ2h0ID0gMTAsIHdpZHRoID0gMjApCkRpbVBsb3QoYWxsX2RhdGEsIGdyb3VwLmJ5ID0gJ2lkZW50JywgY29scyA9ICkKRGltUGxvdChhbGxfZGF0YSwgZ3JvdXAuYnkgPSAiTGluZWFnZSIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKQpkZXYub2ZmKCkKCmBgYAoKYGBge3J9CnBkZignMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL3Rlc3RfdmlvbGluLnBkZicsIGhlaWdodCA9IDEwLCB3aWR0aCA9IDMwKQoKVmxuUGxvdChhbGxfZGF0YSwgZmVhdHVyZXMgPSAnTkdGUicsIGlkZW50cyA9ICdNYWludGFpbmVkIFJlc2lzdGFudCB0byBEYWJUcmFtJywgZ3JvdXAuYnkgPSAiTGluZWFnZSIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArIGdlb21fYm94cGxvdChmaWxsID0gJ3doaXRlJywgd2lkdGggPSAwLjEpClZsblBsb3QoYWxsX2RhdGEsIGZlYXR1cmVzID0gJ0VHRlInLCBpZGVudHMgPSAnTWFpbnRhaW5lZCBSZXNpc3RhbnQgdG8gRGFiVHJhbScsIGdyb3VwLmJ5ID0gIkxpbmVhZ2UiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKyBnZW9tX2JveHBsb3QoZmlsbCA9ICd3aGl0ZScsIHdpZHRoID0gMC4xKQpWbG5QbG90KGFsbF9kYXRhLCBmZWF0dXJlcyA9ICdOR0ZSJywgaWRlbnRzID0gJ01haW50YWluZWQgUmVzaXN0YW50IHRvIERhYlRyYW10b0RhYlRyYW0nLCBncm91cC5ieSA9ICJMaW5lYWdlIikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsgZ2VvbV9ib3hwbG90KGZpbGwgPSAnd2hpdGUnLCB3aWR0aCA9IDAuMSkKVmxuUGxvdChhbGxfZGF0YSwgZmVhdHVyZXMgPSAnRUdGUicsIGlkZW50cyA9ICdNYWludGFpbmVkIFJlc2lzdGFudCB0byBEYWJUcmFtdG9EYWJUcmFtJywgZ3JvdXAuYnkgPSAiTGluZWFnZSIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArIGdlb21fYm94cGxvdChmaWxsID0gJ3doaXRlJywgd2lkdGggPSAwLjEpCgpWbG5QbG90KGFsbF9kYXRhLCBmZWF0dXJlcyA9ICdOR0ZSJywgaWRlbnRzID0gJ0xhcmdlIFJlc2lzdGFudCB0byBEYWJUcmFtJywgZ3JvdXAuYnkgPSAiTGluZWFnZSIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArIGdlb21fYm94cGxvdChmaWxsID0gJ3doaXRlJywgd2lkdGggPSAwLjEpClZsblBsb3QoYWxsX2RhdGEsIGZlYXR1cmVzID0gJ0VHRlInLCBpZGVudHMgPSAnTGFyZ2UgUmVzaXN0YW50IHRvIERhYlRyYW0nLCBncm91cC5ieSA9ICJMaW5lYWdlIikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsgZ2VvbV9ib3hwbG90KGZpbGwgPSAnd2hpdGUnLCB3aWR0aCA9IDAuMSkKVmxuUGxvdChhbGxfZGF0YSwgZmVhdHVyZXMgPSAnTkdGUicsIGlkZW50cyA9ICdMYXJnZSBSZXNpc3RhbnQgdG8gRGFiVHJhbXRvRGFiVHJhbScsIGdyb3VwLmJ5ID0gIkxpbmVhZ2UiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKyBnZW9tX2JveHBsb3QoZmlsbCA9ICd3aGl0ZScsIHdpZHRoID0gMC4xKQpWbG5QbG90KGFsbF9kYXRhLCBmZWF0dXJlcyA9ICdFR0ZSJywgaWRlbnRzID0gJ0xhcmdlIFJlc2lzdGFudCB0byBEYWJUcmFtdG9EYWJUcmFtJywgZ3JvdXAuYnkgPSAiTGluZWFnZSIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArIGdlb21fYm94cGxvdChmaWxsID0gJ3doaXRlJywgd2lkdGggPSAwLjEpCgpkZXYub2ZmKCkKI1ZsblBsb3QoYWxsX2RhdGEsIGZlYXR1cmVzID0gJ05HRlInLCBpZGVudHMgPSBhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gJ2RhYnRyYW0nLCBncm91cC5ieSA9ICJsaW5lYWdlIikKYGBgCgojTG9va2luZyBpbnRvIHRoZSBvbmUgbGluZWFnZSB0aGF0IHN3aXRjaGVzIG5nZnIgLT4gZWdmcgpgYGB7cn0KCnN3aXRjaF9saW5fZGFidHJhbSA8LSBuYW1lcyhhbGxfZGF0YSRvcmlnLmlkZW50W2FsbF9kYXRhJExpbmVhZ2UgPT0gIkxpbjE3MTUxNiIgJiBhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gJ2RhYnRyYW0nXSkKc3dpdGNoX2xpbl9kYWJ0cmFtdG9kYWJ0cmFtIDwtIG5hbWVzKGFsbF9kYXRhJG9yaWcuaWRlbnRbYWxsX2RhdGEkTGluZWFnZSA9PSAiTGluMTcxNTE2IiAmIGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAnZGFidHJhbXRvZGFidHJhbSddKQoKRGltUGxvdChhbGxfZGF0YSwgZ3JvdXAuYnkgPSAiT0dfY29uZGl0aW9uIiwgY29scyA9IGMoJ2RhYnRyYW0nID0gJyM2MjM1OTQnLCAnY29jbDInID0gJyMwRjgyNDEnLCAnY2lzJyA9ICcjQzk2RDI5JywgJ2RhYnRyYW10b2RhYnRyYW0nID0gJyM1NjFFNTknLCAnZGFidHJhbXRvY29jbDInID0gJyNBMjI0OEUnLCAnZGFidHJhbXRvY2lzJyA9ICcjOUQ4NUJFJywgJ2NvY2wydG9kYWJ0cmFtJyA9ICcjMTA0MTNCJywgJ2NvY2wydG9jb2NsMicgPSAnIzZBQkQ0NScsICdjb2NsMnRvY2lzJyA9ICcjNkRDNDlDJywgJ2Npc3RvZGFidHJhbScgPSAnI0EyMzYyMicsICdjaXN0b2NvY2wyJyA9ICcjRjQ5MTI5JywgJ2Npc3RvY2lzJyA9ICcjRkJEMDhDJykpCkRpbVBsb3QoYWxsX2RhdGEsIGNlbGxzLmhpZ2hsaWdodCA9IGxpc3Qoc3dpdGNoX2xpbl9kYWJ0cmFtKSwgY29scy5oaWdobGlnaHQgPSBjKCdyZWQnKSkKRGltUGxvdChhbGxfZGF0YSwgY2VsbHMuaGlnaGxpZ2h0ID0gbGlzdChzd2l0Y2hfbGluX2RhYnRyYW0sIHN3aXRjaF9saW5fZGFidHJhbXRvZGFidHJhbSksIGNvbHMuaGlnaGxpZ2h0ID0gYygnYmx1ZScsICdyZWQnKSkKCnN3aXRjaF9saW4gPC0gbmFtZXMoZGFidHJhbSRvcmlnLmlkZW50W2RhYnRyYW0kTGluZWFnZSA9PSAiTGluMTcxNTE2Il0pCkRpbVBsb3QoZGFidHJhbSkKRGltUGxvdChkYWJ0cmFtLCBjZWxscy5oaWdobGlnaHQgPSBsaXN0KHN3aXRjaF9saW4pKQoKI25lZWQgdG8gaW50ZWdyYXRlIGxpbmVhZ2VzIGludG8ganVzdCBkYWJ0cmFtIG9iamVjdCBhbmQgdGhlbiBwbG90IG9mZiBvZiB0aGlzIGlzbnRlYWQ/CiN2bG5wbG90KGFsbF9kYXRhLCBmZWF0dXJlcyA9IG5nZnIsIGlkZW50cyA9IGp1c3QgdGhlIGNlbGxzIHJlc2lzdGFudCB0byBkYWJ0cmFtLCBncm91cC5ieSA9IGxpbmVhZ2UgYnV0IGkgb25seSB3YW50IHRob3NlIGluY2x1ZGVkIGluIGNvbWJpbmVkX2xpbnNfbGlzdCRkYWJ0cmFtID8KCmBgYAoKI2Zyb20gZGFidHJhbV9ib3RoX3RpbWVzLCBmb3JjZSAyIGNsdXN0ZXJzIGluIHVtYXAsIHBsb3QgdnMgbmdmciBlZ2ZyLCBmaW5kIG1hcmtlcnMgb2YgdGhlc2UgMgpgYGB7cn0KCmRhYnRyYW1fYm90aF90aW1lc19tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKGRhYnRyYW1fYm90aF90aW1lcywgb25seS5wb3MgPSBUUlVFLCBtaW4ucGN0ID0gMC4yNSwgbG9nZmMudGhyZXNob2xkID0gMC4yNSkKRGltUGxvdChkYWJ0cmFtX2JvdGhfdGltZXMpCkRpbVBsb3QoZGFidHJhbV9ib3RoX3RpbWVzLCBncm91cC5ieSA9ICdPR19jb25kaXRpb24nKQpGZWF0dXJlUGxvdChkYWJ0cmFtX2JvdGhfdGltZXMsIGZlYXR1cmVzID0gYygnTkdGUicsICdFR0ZSJywgJ25GZWF0dXJlX1JOQScpKQpgYGAKCiNBc3NpZ24gY2x1c3RlciBhc3NpZ25tZW50cyBwZXIgbGluZWFnZSwgZmluZCBhdmVyYWdlIHNjb3JlIHBlciBsaW5lYWdlIC0gbWFrZSBwbG90cyBpbiBvcmRlcgpgYGB7cn0KI2F2ZXJhZ2UgY2VsbCBhc3NpZ25tZW50cyBwZXIgbGluZWFnZSBpbiBkYWJ0cmFtX21haW50YWluZWQKCiN3YW50IHRvIGRvIGEgc3RhY2tlZCBiYXJwbG90IGhlcmUtLSBjb3B5IHBhc3RlIGNvZGUgZnJvbSBjb25kaXRpb24gY2x1c3RlcmluZwoKI2dldCBsaW5lYWdlIGFuZCBjbHVzdGVyIGRhdGEgZnJvbSBzZXVyYXQgb2JqZWN0LCBzd2l0Y2ggY2x1c3RlciBpZGVudGlmaWVycyBmcm9tIDAsMSB0byAtMSwxIChlZ2ZyLCBuZ2ZyKQpjbHVzdGVyc19wZXJfbGluIDwtIGRhdGEuZnJhbWUgKENsdXN0ZXIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYWJ0cmFtX2JvdGhfdGltZXMkc2V1cmF0X2NsdXN0ZXJzKSksIExpbmVhZ2UgPSBkYWJ0cmFtX2JvdGhfdGltZXMkTGluZWFnZSwgY29uZGl0aW9uID0gZGFidHJhbV9ib3RoX3RpbWVzJE9HX2NvbmRpdGlvbikKY2x1c3RlcnNfcGVyX2xpbiRDbHVzdGVyW2NsdXN0ZXJzX3Blcl9saW4kQ2x1c3RlciA9PSAwXSA8LSAtMQpjbHVzdGVyc19wZXJfbGluX2xpc3QgPC0gbGlzdCgpCgojIE5lZWQgdG8gZ2V0IHBlcmNlbnQgdmFsdWVzIG9mIEVHRlIgZm9yIHRoZSBsaW5lYWdlIGFmdGVyIHRoZSBmaXJzdCB0cmVhdG1lbnQKZm9yIChpIGluIGZpdmVjZWxsX2NETkEkRGFiVHJhbSl7CiAgY3VycmVudGxpbiA8LSBmaWx0ZXIoY2x1c3RlcnNfcGVyX2xpbiwgY2x1c3RlcnNfcGVyX2xpbiRMaW5lYWdlID09IGkgJiBjbHVzdGVyc19wZXJfbGluJGNvbmRpdGlvbiA9PSAnZGFidHJhbScpCiAgVmFyMSA8LSBjKC0xLDEpCiAgRnJlcSA8LSBjKHN1bShmaWx0ZXIoY2x1c3RlcnNfcGVyX2xpbiwgY2x1c3RlcnNfcGVyX2xpbiRMaW5lYWdlID09IGkgJiBjbHVzdGVyc19wZXJfbGluJGNvbmRpdGlvbiA9PSAnZGFidHJhbScpJENsdXN0ZXIgPT0gLTEpLCAjIEVHRlIKICBzdW0oZmlsdGVyKGNsdXN0ZXJzX3Blcl9saW4sIGNsdXN0ZXJzX3Blcl9saW4kTGluZWFnZSA9PSBpICYgY2x1c3RlcnNfcGVyX2xpbiRjb25kaXRpb24gPT0gJ2RhYnRyYW0nKSRDbHVzdGVyID09IDEpKQogIGNsdXN0ZXJzX3Blcl9saW5fbGlzdFtbaV1dIDwtIGRhdGEuZnJhbWUoJ1ZhcjEnID0gVmFyMSwgJ0ZyZXEnID0gRnJlcSkKICBjbHVzdGVyc19wZXJfbGluX2xpc3RbW2ldXSRTY29yZSA8LSB3ZWlnaHRlZC5tZWFuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGNsdXN0ZXJzX3Blcl9saW5fbGlzdFtbaV1dJFZhcjEpKSwgY2x1c3RlcnNfcGVyX2xpbl9saXN0W1tpXV0kRnJlcSkKfQoKIyBCdWlsZCBhIGRhdGFmcmFtZSBmb3IgcGxvdHRpbmcgYmFzZWQgb24gJSBFR0ZSIG9yIE5HRlIgcGVyIGxpbmVhZ2UgYWZ0ZXIgZmlyc3QgdHJlYXRtZW50CmNsdXN0ZXJzX3Blcl9saW5fZGYgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IDUsIG5yb3cgPSAwKSkKY29sbmFtZXMoY2x1c3RlcnNfcGVyX2xpbl9kZikgPC0gYygnTGluZWFnZScsICdQZXJjZW50X2NlbGxzJywgJ051bV9jZWxscycsICdTY29yZScpCmZvciAoaSBpbiBuYW1lcyhjbHVzdGVyc19wZXJfbGluX2xpc3QpKXsKICAgIGNsdXN0ZXJzX3Blcl9saW5fZGYgPC0gcmJpbmQoY2x1c3RlcnNfcGVyX2xpbl9kZiwgZGF0YS5mcmFtZSgnTGluZWFnZScgPSBpLCAnUGVyY2VudF9jZWxscycgPSBjbHVzdGVyc19wZXJfbGluX2xpc3RbW2ldXSRGcmVxW2NsdXN0ZXJzX3Blcl9saW5fbGlzdFtbaV1dJFZhcjEgPT0gMV0vc3VtKGNsdXN0ZXJzX3Blcl9saW5fbGlzdFtbaV1dJEZyZXEpLCAnTnVtX2NlbGxzJyA9IHN1bShjbHVzdGVyc19wZXJfbGluX2xpc3RbW2ldXSRGcmVxW2NsdXN0ZXJzX3Blcl9saW5fbGlzdFtbaV1dJFZhcjEgPT0gMV0pLCAnU2NvcmUnID0gY2x1c3RlcnNfcGVyX2xpbl9saXN0W1tpXV0kU2NvcmVbMV0sICdDbHVzdGVyJyA9ICdOR0ZSJykpICMgQWRkIE5HRlIgcm93CiAgY2x1c3RlcnNfcGVyX2xpbl9kZiA8LSByYmluZChjbHVzdGVyc19wZXJfbGluX2RmLCBkYXRhLmZyYW1lKCdMaW5lYWdlJyA9IGksICdQZXJjZW50X2NlbGxzJyA9IGNsdXN0ZXJzX3Blcl9saW5fbGlzdFtbaV1dJEZyZXFbY2x1c3RlcnNfcGVyX2xpbl9saXN0W1tpXV0kVmFyMSA9PSAtMV0vc3VtKGNsdXN0ZXJzX3Blcl9saW5fbGlzdFtbaV1dJEZyZXEpLCAnTnVtX2NlbGxzJyA9IHN1bShjbHVzdGVyc19wZXJfbGluX2xpc3RbW2ldXSRGcmVxW2NsdXN0ZXJzX3Blcl9saW5fbGlzdFtbaV1dJFZhcjEgPT0gLTFdKSwgJ1Njb3JlJyA9IGNsdXN0ZXJzX3Blcl9saW5fbGlzdFtbaV1dJFNjb3JlWzFdLCAnQ2x1c3RlcicgPSAnRUdGUicpKSAjIEFkZCBFR0ZSIHJvdwp9CgojIFJlb3JkZXIgc28gdGhhdCBFR0ZSIGRvbWluYW50IGxpbmVhZ2VzIGFyZSBwbG90IGZpcnN0CmNsdXN0ZXJzX3Blcl9saW5fZGYgPC0gY2x1c3RlcnNfcGVyX2xpbl9kZlt3aXRoKGNsdXN0ZXJzX3Blcl9saW5fZGYsIG9yZGVyKC1TY29yZSxOdW1fY2VsbHMgKSksXQpjbHVzdGVyc19wZXJfbGluX2RmJExpbmVhZ2UgPC0gZmFjdG9yKGNsdXN0ZXJzX3Blcl9saW5fZGYkTGluZWFnZSwgbGV2ZWxzID0gcmV2KHVuaXF1ZShjbHVzdGVyc19wZXJfbGluX2RmJExpbmVhZ2UpKSkKCiMgbWFrZSBsaXN0IG9iamVjdCBmb3IgYWZ0ZXIgc2Vjb25kIHRyZWF0bWVudApjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjIDwtIGxpc3QoKQoKIyBOZWVkIHRvIGdldCBwZXJjZW50IHZhbHVlcyBvZiBFR0ZSIGZvciB0aGUgbGluZWFnZSBhZnRlciB0aGUgc2Vjb25kIHRyZWF0bWVudApmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSREYWJUcmFtKXsKICBjdXJyZW50bGluIDwtIGZpbHRlcihjbHVzdGVyc19wZXJfbGluLCBjbHVzdGVyc19wZXJfbGluJExpbmVhZ2UgPT0gaSAmIGNsdXN0ZXJzX3Blcl9saW4kY29uZGl0aW9uID09ICdkYWJ0cmFtdG9kYWJ0cmFtJykKICBWYXIxIDwtIGMoLTEsMSkKICBGcmVxIDwtIGMoc3VtKGZpbHRlcihjbHVzdGVyc19wZXJfbGluLCBjbHVzdGVyc19wZXJfbGluJExpbmVhZ2UgPT0gaSAmIGNsdXN0ZXJzX3Blcl9saW4kY29uZGl0aW9uID09ICdkYWJ0cmFtdG9kYWJ0cmFtJykkQ2x1c3RlciA9PSAtMSksICMgRUdGUgogIHN1bShmaWx0ZXIoY2x1c3RlcnNfcGVyX2xpbiwgY2x1c3RlcnNfcGVyX2xpbiRMaW5lYWdlID09IGkgJiBjbHVzdGVyc19wZXJfbGluJGNvbmRpdGlvbiA9PSAnZGFidHJhbXRvZGFidHJhbScpJENsdXN0ZXIgPT0gMSkpCiAgY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dIDwtIGRhdGEuZnJhbWUoJ1ZhcjEnID0gVmFyMSwgJ0ZyZXEnID0gRnJlcSkKICBjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0kU2NvcmUgPC0gd2VpZ2h0ZWQubWVhbihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0kVmFyMSkpLCBjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0kRnJlcSkKfQoKIyBCdWlsZCBhIGRhdGFmcmFtZSBmb3IgcGxvdHRpbmcgYmFzZWQgb24gJSBFR0ZSIG9yIE5HRlIgcGVyIGxpbmVhZ2UgYWZ0ZXIgc2Vjb25kIHRyZWF0bWVudApjbHVzdGVyc19wZXJfbGluX2RmX3NlYyA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gNSwgbnJvdyA9IDApKQpjb2xuYW1lcyhjbHVzdGVyc19wZXJfbGluX2RmX3NlYykgPC0gYygnTGluZWFnZScsICdQZXJjZW50X2NlbGxzJywgJ051bV9jZWxscycsICdTY29yZScsICdDbHVzdGVyJykKZm9yIChpIGluIG5hbWVzKGNsdXN0ZXJzX3Blcl9saW5fbGlzdCkpewoKICBpZiAoc3VtKGNsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSRGcmVxKSA8IDUpewogICAgY2x1c3RlcnNfcGVyX2xpbl9kZl9zZWMgPC0gcmJpbmQoY2x1c3RlcnNfcGVyX2xpbl9kZl9zZWMsIGRhdGEuZnJhbWUoJ0xpbmVhZ2UnID0gaSwgJ1BlcmNlbnRfY2VsbHMnID0gMSwgJ051bV9jZWxscycgPSAwLCAnU2NvcmUnID0gMCwgJ0NsdXN0ZXInID0gJ0RpZWQnKSkgIyBBZGQgTGluZWFnZSBkaWVkIHJvdwogICAgY2x1c3RlcnNfcGVyX2xpbl9kZl9zZWMgPC0gcmJpbmQoY2x1c3RlcnNfcGVyX2xpbl9kZl9zZWMsIGRhdGEuZnJhbWUoJ0xpbmVhZ2UnID0gaSwgJ1BlcmNlbnRfY2VsbHMnID0gMCwgJ051bV9jZWxscycgPSAwLCAnU2NvcmUnID0gMCwgJ0NsdXN0ZXInID0gJ05HRlInKSkgIyBBZGQgTkdGUiByb3cKICAgIGNsdXN0ZXJzX3Blcl9saW5fZGZfc2VjIDwtIHJiaW5kKGNsdXN0ZXJzX3Blcl9saW5fZGZfc2VjLCBkYXRhLmZyYW1lKCdMaW5lYWdlJyA9IGksICdQZXJjZW50X2NlbGxzJyA9IDAsICdOdW1fY2VsbHMnID0gMCwgJ1Njb3JlJyA9IDAsICdDbHVzdGVyJyA9ICdFR0ZSJykpICMgQWRkIEVHRlIgcm93CiAgfWVsc2V7ICMgQWN0dWFsbHkgY2FsY3VsYXRlIHBlcmNlbnRhZ2VzIHNpbmNlIHRoZSBsaW5lYWdlIHN1cnZpdmVkL2lzIG1vcmUgdGhhbiA1IGNlbGxzCiAgICAgIGNsdXN0ZXJzX3Blcl9saW5fZGZfc2VjIDwtIHJiaW5kKGNsdXN0ZXJzX3Blcl9saW5fZGZfc2VjLCBkYXRhLmZyYW1lKCdMaW5lYWdlJyA9IGksICdQZXJjZW50X2NlbGxzJyA9IDAsICdOdW1fY2VsbHMnID0gMCwgJ1Njb3JlJyA9IGNsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSRTY29yZVsxXSwgJ0NsdXN0ZXInID0gJ0RpZWQnKSkgIyBBZGQgTGluZWFnZSBkaWVkIHJvdwogICAgICBjbHVzdGVyc19wZXJfbGluX2RmX3NlYyA8LSByYmluZChjbHVzdGVyc19wZXJfbGluX2RmX3NlYywgZGF0YS5mcmFtZSgnTGluZWFnZScgPSBpLCAnUGVyY2VudF9jZWxscycgPSBjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0kRnJlcVtjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0kVmFyMSA9PSAxXS9zdW0oY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dJEZyZXEpLCAnTnVtX2NlbGxzJyA9IHN1bShjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0kRnJlcVtjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0kVmFyMSA9PSAxXSksICdTY29yZScgPSBjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0kU2NvcmVbMV0sICdDbHVzdGVyJyA9ICdOR0ZSJykpICMgQWRkIE5HRlIgcm93CiAgICAgIGNsdXN0ZXJzX3Blcl9saW5fZGZfc2VjIDwtIHJiaW5kKGNsdXN0ZXJzX3Blcl9saW5fZGZfc2VjLCBkYXRhLmZyYW1lKCdMaW5lYWdlJyA9IGksICdQZXJjZW50X2NlbGxzJyA9IGNsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSRGcmVxW2NsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSRWYXIxID09IC0xXS9zdW0oY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dJEZyZXEpLCAnTnVtX2NlbGxzJyA9IHN1bShjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0kRnJlcVtjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0kVmFyMSA9PSAtMV0pLCAnU2NvcmUnID0gY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dJFNjb3JlWzFdLCAnQ2x1c3RlcicgPSAnRUdGUicpKSAjIEFkZCBFR0ZSIHJvdwogICAgfQp9CgojIFJlb3JkZXIgc28gdGhhdCBFR0ZSIGRvbWluYW50IGxpbmVhZ2VzIGFyZSBwbG90IGZpcnN0CmNsdXN0ZXJzX3Blcl9saW5fZGZfc2VjJExpbmVhZ2UgPC0gZmFjdG9yKGNsdXN0ZXJzX3Blcl9saW5fZGZfc2VjJExpbmVhZ2UsIGxldmVscyA9IHJldih1bmlxdWUoY2x1c3RlcnNfcGVyX2xpbl9kZiRMaW5lYWdlKSkpCgojIFBsb3QKcDEgPC0gZ2dwbG90KGNsdXN0ZXJzX3Blcl9saW5fZGYsIGFlcyh5ID0gUGVyY2VudF9jZWxscywgeCA9IExpbmVhZ2UsIGZpbGwgPSBDbHVzdGVyKSkgKyBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JywgcG9zaXRpb24gPSBwb3NpdGlvbl9maWxsKHJldmVyc2UgPSBUKSwgY29sb3IgPSAnI0QzRDNEMycpICsgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzAwMDAwMCIsIiNGRkZGRkYiKSkgKyB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpCnAyIDwtIGdncGxvdChjbHVzdGVyc19wZXJfbGluX2RmX3NlYywgYWVzKHkgPSBQZXJjZW50X2NlbGxzLCB4ID0gTGluZWFnZSwgZmlsbCA9IENsdXN0ZXIpKSArIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2ZpbGwocmV2ZXJzZSA9IFQpLCBjb2xvciA9ICcjRDNEM0QzJykgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkYwMDAwIiwiIzAwMDAwMCIsICcjRkZGRkZGJykpICsgdGhlbWVfY2xhc3NpYygpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQoKcGRmKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vc3RhY2tlZF9iYXJfRUdGUl9OR0ZSX0RpZWQucGRmJykKZ2dhcnJhbmdlKHAxLHAyLCBucm93ID0gMikKZGV2Lm9mZigpCmBgYAoKIyBMb29rIGF0IHdoZXRoZXIgbGluZWFnZXMgY2x1c3RlciB0b2dldGhlciBpbiBlYWNoIGluZGl2aWR1YWwgY29uZGl0aW9uIC0gU3RhcnRpbmcgd2l0aCBEYWJUcmFtCmBgYHtyfQpybShkYWJ0cmFtLCBjaXMsIGNvY2wyKSAjIFJlbW92ZSBvbGQgc2V1cmF0IG9iamVjdHMgdGhhdCBhcmUgbm8gbG9uZ2VyIG5lZWRlZApJZGVudHMoYWxsX2RhdGEpIDwtIGFsbF9kYXRhJE9HX2NvbmRpdGlvbiAjIENoYW5nZSB0aGUgaWRlbnRzIHRvIHRoZSBPRyBjb25kaXRpb24gZm9yIHN1YnNldHRpbmcgdG8gZGFidHJhbQpkYWJ0cmFtIDwtIHN1YnNldChhbGxfZGF0YSwgaWRlbnRzID0gJ2RhYnRyYW0nKSAjIFN1YnNldCBkb3duIHRvIHRoZSBkYWJ0cmFtIG9iamVjdAoKRWxib3dQbG90KGRhYnRyYW0pICMgVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBzZWVtcyB0byByZWFsbHkgbGV2ZWwgb2ZmIGF0IDEwCgojIFJlY2x1c3RlciB3aXRoIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgZGltZW5zaW9ucwpkYWJ0cmFtIDwtIEZpbmROZWlnaGJvcnMoZGFidHJhbSwgZGltcyA9IDE6MTApCmRhYnRyYW0gPC0gRmluZENsdXN0ZXJzKGRhYnRyYW0sIHJlc29sdXRpb24gPSAwLjUpCmRhYnRyYW0gPC0gUnVuVU1BUChkYWJ0cmFtLCBkaW1zID0gMToxMCkKRGltUGxvdChkYWJ0cmFtLCByZWR1Y3Rpb24gPSAndW1hcCcpCgojIEJ1aWxkIGxpc3Qgb2YgbGluZWFnZXMgd2l0aCBhdCBsZWFzdCA1IGNlbGxzIGluIGRhYiB0cmFtIGFuZCBjaGVjayB3aGF0IHNldXJhdCBjbHVzdGVyIHRoZSBjZWxscyBhcmUgaW4gCmRhYnRyYW1fbGluX2NsdXN0X2xpc3QgPC0gbGlzdCgpCgpmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSREYWJUcmFtKXsKICB0ZW1wX2RmIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoSWRlbnRzKGRhYnRyYW0pW2RhYnRyYW0kTGluZWFnZSA9PSBpXSkpCiAgY29sbmFtZXModGVtcF9kZikgPC0gYygnU2V1cmF0X2NsdXN0JywgJ051bV9jZWxscycpCiAgdGVtcF9kZiRQY250X2NlbGxzIDwtIHRlbXBfZGYkTnVtX2NlbGxzL3N1bSh0ZW1wX2RmJE51bV9jZWxscykKICBkYWJ0cmFtX2xpbl9jbHVzdF9saXN0W1tpXV0gPC0gdGVtcF9kZgp9CgojIE5lZWQgdG8gZG8gYSByYW5kb20gc2FtcGxpbmcgb2YgdGhlIHNhbWUgdGhpbmcgCmRhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdCA8LSBsaXN0KCkKbnVtX2l0ZXIgPC0gMTAwMCAKZm9yKGogaW4gMTpudW1faXRlcil7CiAgc2V0LnNlZWQoaikKICBkYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXSA8LSBsaXN0KCkKICBmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSREYWJUcmFtKXsKICAgIG51bV9jZWxscyA8LSBsZW5ndGgoZGFidHJhbSRMaW5lYWdlW2RhYnRyYW0kTGluZWFnZSA9PSBpXSkKICAgIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShzYW1wbGUoSWRlbnRzKGRhYnRyYW0pLCBudW1fY2VsbHMsIHJlcGxhY2UgPSBGKSkpCiAgICBjb2xuYW1lcyh0ZW1wX2RmKSA8LSBjKCdTZXVyYXRfY2x1c3QnLCAnTnVtX2NlbGxzJykKICAgIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgICBkYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXVtbaV1dIDwtIHRlbXBfZGYKICB9Cn0KYGBgCiMgU2lnbmlmaWNhbmNlIHRlc3Rpbmcgb2YgdGhlIGRhYnRyYW0gc2ltdWxhdGlvbgpgYGB7cn0KIyBGaW5kIHRoZSBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24KbWVhbl9kYWJ0cmFtIDwtIG1lYW4odW5saXN0KGxhcHBseShkYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpKQptZWFuc19kYWJ0cmFtX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0KSwgZnVuY3Rpb24oeSkKICBtZWFuKHVubGlzdChsYXBwbHkoZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpKQp6X21lYW5fZGFidHJhbSA8LSAobWVhbl9kYWJ0cmFtLW1lYW4obWVhbnNfZGFidHJhbV9zaW0pKS9zZChtZWFuc19kYWJ0cmFtX3NpbSkKcHZhbF9tZWFuX2RhYnRyYW0gPC0gcG5vcm0oel9tZWFuX2RhYnRyYW0sIG1lYW4obWVhbnNfZGFidHJhbV9zaW0pLCBzZChtZWFuc19kYWJ0cmFtX3NpbSksIGxvd2VyLnRhaWwgPSBGKQoKIyBGaW5kIHRoZSB3ZWlnaHRlZCBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24Kd2VpZ2h0ZWRfbWVhbl9kYWJ0cmFtIDwtIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShkYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAp1bmxpc3QobGFwcGx5KGRhYnRyYW1fbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkKd2VpZ2h0ZWRfbWVhbnNfZGFidHJhbV9zaW0gPC0gc2FwcGx5KDE6bGVuZ3RoKGRhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGRhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAogICAgICAgICAgICAgICAgdW5saXN0KGxhcHBseShkYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKSkKel93bWVhbl9kYWJ0cmFtIDwtICh3ZWlnaHRlZF9tZWFuX2RhYnRyYW0tbWVhbih3ZWlnaHRlZF9tZWFuc19kYWJ0cmFtX3NpbSkpL3NkKHdlaWdodGVkX21lYW5zX2RhYnRyYW1fc2ltKQpwdmFsX3dtZWFuX2RhYnRyYW0gPC0gcG5vcm0oel93bWVhbl9kYWJ0cmFtLCBtZWFuKHdlaWdodGVkX21lYW5zX2RhYnRyYW1fc2ltKSwgc2Qod2VpZ2h0ZWRfbWVhbnNfZGFidHJhbV9zaW0pLCBsb3dlci50YWlsID0gRikKCiMgQ29tcGFyZSBlYWNoIGluZGl2aWR1YWwgZGlzdHJpYnV0aW9uIG9mIG1heGVzIHRvIHRoZSBvYnNlcnZlZCBtYXggYnkgdCB0ZXN0IGFuZCB0cmFjayBwdmFsCnR0ZXN0X3B2YWxfZGFidHJhbSA8LSBjKCkKZm9yIChpIGluIDE6bGVuZ3RoKG1lYW5zX2RhYnRyYW1fc2ltKSl7CiAgc2ltX21heGVzIDwtIHVubGlzdChsYXBwbHkoZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1tpXV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkKICB0dGVzdF9wdmFsX2RhYnRyYW0gPC0gY2JpbmQodHRlc3RfcHZhbF9kYWJ0cmFtLHQudGVzdCh4ID0gdW5saXN0KGxhcHBseShkYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLHkgPSB1bmxpc3QobGFwcGx5KGRhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLCBhbHRlcm5hdGl2ZSA9ICdncmVhdGVyJykkcC52YWx1ZSkKfQoKIyBTYXZlIG91dHB1dHMKc2F2ZShkYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBkYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3Qsel9tZWFuX2RhYnRyYW0scHZhbF9tZWFuX2RhYnRyYW0sIHpfd21lYW5fZGFidHJhbSwgdHRlc3RfcHZhbF9kYWJ0cmFtLCBmaWxlID0gJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9kYWJ0cmFtX3NpbV9yZXN1bHRzLlJEYXRhJykKcm0oZGFidHJhbSkKYGBgCgojIExvb2sgYXQgd2hldGhlciBsaW5lYWdlcyBjbHVzdGVyIHRvZ2V0aGVyIGluIGVhY2ggaW5kaXZpZHVhbCBjb25kaXRpb24gLSAgRGFiVHJhbXRvRGFiVHJhbQpgYGB7cn0KSWRlbnRzKGFsbF9kYXRhKSA8LSBhbGxfZGF0YSRPR19jb25kaXRpb24gIyBDaGFuZ2UgdGhlIGlkZW50cyB0byB0aGUgT0cgY29uZGl0aW9uIGZvciBzdWJzZXR0aW5nIHRvIGRhYnRyYW10b2RhYnRyYW0KZGFidHJhbXRvZGFidHJhbSA8LSBzdWJzZXQoYWxsX2RhdGEsIGlkZW50cyA9ICdkYWJ0cmFtdG9kYWJ0cmFtJykgIyBTdWJzZXQgZG93biB0byB0aGUgZGFidHJhbXRvZGFidHJhbSBvYmplY3QKCkVsYm93UGxvdChkYWJ0cmFtdG9kYWJ0cmFtKSAjIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gc2VlbXMgdG8gcmVhbGx5IGxldmVsIG9mZiBhdCAxMAoKIyBSZWNsdXN0ZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMKZGFidHJhbXRvZGFidHJhbSA8LSBGaW5kTmVpZ2hib3JzKGRhYnRyYW10b2RhYnRyYW0sIGRpbXMgPSAxOjEwKQpkYWJ0cmFtdG9kYWJ0cmFtIDwtIEZpbmRDbHVzdGVycyhkYWJ0cmFtdG9kYWJ0cmFtLCByZXNvbHV0aW9uID0gMC41KQpkYWJ0cmFtdG9kYWJ0cmFtIDwtIFJ1blVNQVAoZGFidHJhbXRvZGFidHJhbSwgZGltcyA9IDE6MTApCkRpbVBsb3QoZGFidHJhbXRvZGFidHJhbSwgcmVkdWN0aW9uID0gJ3VtYXAnKQoKIyBCdWlsZCBsaXN0IG9mIGxpbmVhZ2VzIHdpdGggYXQgbGVhc3QgNSBjZWxscyBpbiBkYWIgdHJhbSBhbmQgY2hlY2sgd2hhdCBzZXVyYXQgY2x1c3RlciB0aGUgY2VsbHMgYXJlIGluIApkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9saXN0IDwtIGxpc3QoKQoKZm9yIChpIGluIGZpdmVjZWxsX2NETkEkRGFiVHJhbXRvRGFiVHJhbSl7CiAgdGVtcF9kZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKElkZW50cyhkYWJ0cmFtdG9kYWJ0cmFtKVtkYWJ0cmFtdG9kYWJ0cmFtJExpbmVhZ2UgPT0gaV0pKQogIGNvbG5hbWVzKHRlbXBfZGYpIDwtIGMoJ1NldXJhdF9jbHVzdCcsICdOdW1fY2VsbHMnKQogIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfbGlzdFtbaV1dIDwtIHRlbXBfZGYKfQoKIyBOZWVkIHRvIGRvIGEgcmFuZG9tIHNhbXBsaW5nIG9mIHRoZSBzYW1lIHRoaW5nIApkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3QgPC0gbGlzdCgpCm51bV9pdGVyIDwtIDEwMDAgCmZvcihqIGluIDE6bnVtX2l0ZXIpewogIHNldC5zZWVkKGopCiAgZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1tqXV0gPC0gbGlzdCgpCiAgZm9yIChpIGluIGZpdmVjZWxsX2NETkEkRGFiVHJhbXRvRGFiVHJhbSl7CiAgICBudW1fY2VsbHMgPC0gbGVuZ3RoKGRhYnRyYW10b2RhYnRyYW0kTGluZWFnZVtkYWJ0cmFtdG9kYWJ0cmFtJExpbmVhZ2UgPT0gaV0pCiAgICB0ZW1wX2RmIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoc2FtcGxlKElkZW50cyhkYWJ0cmFtdG9kYWJ0cmFtKSwgbnVtX2NlbGxzLCByZXBsYWNlID0gRikpKQogICAgY29sbmFtZXModGVtcF9kZikgPC0gYygnU2V1cmF0X2NsdXN0JywgJ051bV9jZWxscycpCiAgICB0ZW1wX2RmJFBjbnRfY2VsbHMgPC0gdGVtcF9kZiROdW1fY2VsbHMvc3VtKHRlbXBfZGYkTnVtX2NlbGxzKQogICAgZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1tqXV1bW2ldXSA8LSB0ZW1wX2RmCiAgfQp9CmBgYAoKIyBTaWduaWZpY2FuY2UgdGVzdGluZyBvZiB0aGUgZGFidHJhbXRvZGFidHJhbSBzaW11bGF0aW9uCmBgYHtyfQojIEZpbmQgdGhlIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgptZWFuX2RhYnRyYW10b2RhYnRyYW0gPC0gbWVhbih1bmxpc3QobGFwcGx5KGRhYnRyYW10b2RhYnRyYW1fbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpCm1lYW5zX2RhYnRyYW10b2RhYnRyYW1fc2ltIDwtIHNhcHBseSgxOmxlbmd0aChkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIG1lYW4odW5saXN0KGxhcHBseShkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSkpCnpfbWVhbl9kYWJ0cmFtdG9kYWJ0cmFtIDwtIChtZWFuX2RhYnRyYW10b2RhYnRyYW0tbWVhbihtZWFuc19kYWJ0cmFtdG9kYWJ0cmFtX3NpbSkpL3NkKG1lYW5zX2RhYnRyYW10b2RhYnRyYW1fc2ltKQpwdmFsX21lYW5fZGFidHJhbXRvZGFidHJhbSA8LSBwbm9ybSh6X21lYW5fZGFidHJhbXRvZGFidHJhbSwgbWVhbihtZWFuc19kYWJ0cmFtdG9kYWJ0cmFtX3NpbSksIHNkKG1lYW5zX2RhYnRyYW10b2RhYnRyYW1fc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIEZpbmQgdGhlIHdlaWdodGVkIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgp3ZWlnaHRlZF9tZWFuX2RhYnRyYW10b2RhYnRyYW0gPC0gd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGRhYnRyYW10b2RhYnRyYW1fbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCnVubGlzdChsYXBwbHkoZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKQp3ZWlnaHRlZF9tZWFuc19kYWJ0cmFtdG9kYWJ0cmFtX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0KSwgZnVuY3Rpb24oeSkKICB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCiAgICAgICAgICAgICAgICB1bmxpc3QobGFwcGx5KGRhYnRyYW10b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpKQp6X3dtZWFuX2RhYnRyYW10b2RhYnRyYW0gPC0gKHdlaWdodGVkX21lYW5fZGFidHJhbXRvZGFidHJhbS1tZWFuKHdlaWdodGVkX21lYW5zX2RhYnRyYW10b2RhYnRyYW1fc2ltKSkvc2Qod2VpZ2h0ZWRfbWVhbnNfZGFidHJhbXRvZGFidHJhbV9zaW0pCnB2YWxfd21lYW5fZGFidHJhbXRvZGFidHJhbSA8LSBwbm9ybSh6X3dtZWFuX2RhYnRyYW10b2RhYnRyYW0sIG1lYW4od2VpZ2h0ZWRfbWVhbnNfZGFidHJhbXRvZGFidHJhbV9zaW0pLCBzZCh3ZWlnaHRlZF9tZWFuc19kYWJ0cmFtdG9kYWJ0cmFtX3NpbSksIGxvd2VyLnRhaWwgPSBGKQoKIyBDb21wYXJlIGVhY2ggaW5kaXZpZHVhbCBkaXN0cmlidXRpb24gb2YgbWF4ZXMgdG8gdGhlIG9ic2VydmVkIG1heCBieSB0IHRlc3QgYW5kIHRyYWNrIHB2YWwKdHRlc3RfcHZhbF9kYWJ0cmFtdG9kYWJ0cmFtIDwtIGMoKQpmb3IgKGkgaW4gMTpsZW5ndGgobWVhbnNfZGFidHJhbXRvZGFidHJhbV9zaW0pKXsKICBzaW1fbWF4ZXMgPC0gdW5saXN0KGxhcHBseShkYWJ0cmFtdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKQogIHR0ZXN0X3B2YWxfZGFidHJhbXRvZGFidHJhbSA8LSBjYmluZCh0dGVzdF9wdmFsX2RhYnRyYW10b2RhYnRyYW0sdC50ZXN0KHggPSB1bmxpc3QobGFwcGx5KGRhYnRyYW10b2RhYnRyYW1fbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkseSA9IHVubGlzdChsYXBwbHkoZGFidHJhbXRvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1tpXV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksIGFsdGVybmF0aXZlID0gJ2dyZWF0ZXInKSRwLnZhbHVlKQp9CgojIFNhdmUgb3V0cHV0cwpzYXZlKGRhYnRyYW10b2RhYnRyYW1fbGluX2NsdXN0X2xpc3QsIGRhYnRyYW10b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdCx6X21lYW5fZGFidHJhbXRvZGFidHJhbSxwdmFsX21lYW5fZGFidHJhbXRvZGFidHJhbSwgel93bWVhbl9kYWJ0cmFtdG9kYWJ0cmFtLCB0dGVzdF9wdmFsX2RhYnRyYW10b2RhYnRyYW0sIGZpbGUgPSAnMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL2RhYnRyYW10b2RhYnRyYW1fc2ltX3Jlc3VsdHMuUkRhdGEnKQpybShkYWJ0cmFtdG9kYWJ0cmFtKQpgYGAKCiMgTG9vayBhdCB3aGV0aGVyIGxpbmVhZ2VzIGNsdXN0ZXIgdG9nZXRoZXIgaW4gZWFjaCBpbmRpdmlkdWFsIGNvbmRpdGlvbiAtICBEYWJUcmFtdG9DaXMKYGBge3J9CklkZW50cyhhbGxfZGF0YSkgPC0gYWxsX2RhdGEkT0dfY29uZGl0aW9uICMgQ2hhbmdlIHRoZSBpZGVudHMgdG8gdGhlIE9HIGNvbmRpdGlvbiBmb3Igc3Vic2V0dGluZyB0byBkYWJ0cmFtdG9jaXMKZGFidHJhbXRvY2lzIDwtIHN1YnNldChhbGxfZGF0YSwgaWRlbnRzID0gJ2RhYnRyYW10b2NpcycpICMgU3Vic2V0IGRvd24gdG8gdGhlIGRhYnRyYW10b2NpcyBvYmplY3QKCkVsYm93UGxvdChkYWJ0cmFtdG9jaXMpICMgVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBzZWVtcyB0byByZWFsbHkgbGV2ZWwgb2ZmIGF0IDEwCgojIFJlY2x1c3RlciB3aXRoIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgZGltZW5zaW9ucwpkYWJ0cmFtdG9jaXMgPC0gRmluZE5laWdoYm9ycyhkYWJ0cmFtdG9jaXMsIGRpbXMgPSAxOjEwKQpkYWJ0cmFtdG9jaXMgPC0gRmluZENsdXN0ZXJzKGRhYnRyYW10b2NpcywgcmVzb2x1dGlvbiA9IDAuNSkKZGFidHJhbXRvY2lzIDwtIFJ1blVNQVAoZGFidHJhbXRvY2lzLCBkaW1zID0gMToxMCkKRGltUGxvdChkYWJ0cmFtdG9jaXMsIHJlZHVjdGlvbiA9ICd1bWFwJykKCiMgQnVpbGQgbGlzdCBvZiBsaW5lYWdlcyB3aXRoIGF0IGxlYXN0IDUgY2VsbHMgaW4gZGFiIHRyYW0gYW5kIGNoZWNrIHdoYXQgc2V1cmF0IGNsdXN0ZXIgdGhlIGNlbGxzIGFyZSBpbiAKZGFidHJhbXRvY2lzX2xpbl9jbHVzdF9saXN0IDwtIGxpc3QoKQoKZm9yIChpIGluIGZpdmVjZWxsX2NETkEkRGFiVHJhbXRvQ2lzKXsKICB0ZW1wX2RmIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoSWRlbnRzKGRhYnRyYW10b2NpcylbZGFidHJhbXRvY2lzJExpbmVhZ2UgPT0gaV0pKQogIGNvbG5hbWVzKHRlbXBfZGYpIDwtIGMoJ1NldXJhdF9jbHVzdCcsICdOdW1fY2VsbHMnKQogIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgZGFidHJhbXRvY2lzX2xpbl9jbHVzdF9saXN0W1tpXV0gPC0gdGVtcF9kZgp9CgojIE5lZWQgdG8gZG8gYSByYW5kb20gc2FtcGxpbmcgb2YgdGhlIHNhbWUgdGhpbmcgCmRhYnRyYW10b2Npc19saW5fY2x1c3RfcmFuZF9saXN0IDwtIGxpc3QoKQpudW1faXRlciA8LSAxMDAwIApmb3IoaiBpbiAxOm51bV9pdGVyKXsKICBzZXQuc2VlZChqKQogIGRhYnRyYW10b2Npc19saW5fY2x1c3RfcmFuZF9saXN0W1tqXV0gPC0gbGlzdCgpCiAgZm9yIChpIGluIGZpdmVjZWxsX2NETkEkRGFiVHJhbXRvQ2lzKXsKICAgIG51bV9jZWxscyA8LSBsZW5ndGgoZGFidHJhbXRvY2lzJExpbmVhZ2VbZGFidHJhbXRvY2lzJExpbmVhZ2UgPT0gaV0pCiAgICB0ZW1wX2RmIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoc2FtcGxlKElkZW50cyhkYWJ0cmFtdG9jaXMpLCBudW1fY2VsbHMsIHJlcGxhY2UgPSBGKSkpCiAgICBjb2xuYW1lcyh0ZW1wX2RmKSA8LSBjKCdTZXVyYXRfY2x1c3QnLCAnTnVtX2NlbGxzJykKICAgIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgICBkYWJ0cmFtdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbal1dW1tpXV0gPC0gdGVtcF9kZgogIH0KfQpgYGAKCiMgU2lnbmlmaWNhbmNlIHRlc3Rpbmcgb2YgdGhlIGRhYnRyYW10b2NpcyBzaW11bGF0aW9uCmBgYHtyfQojIEZpbmQgdGhlIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgptZWFuX2RhYnRyYW10b2NpcyA8LSBtZWFuKHVubGlzdChsYXBwbHkoZGFidHJhbXRvY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpKQptZWFuc19kYWJ0cmFtdG9jaXNfc2ltIDwtIHNhcHBseSgxOmxlbmd0aChkYWJ0cmFtdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgbWVhbih1bmxpc3QobGFwcGx5KGRhYnRyYW10b2Npc19saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpKQp6X21lYW5fZGFidHJhbXRvY2lzIDwtIChtZWFuX2RhYnRyYW10b2Npcy1tZWFuKG1lYW5zX2RhYnRyYW10b2Npc19zaW0pKS9zZChtZWFuc19kYWJ0cmFtdG9jaXNfc2ltKQpwdmFsX21lYW5fZGFidHJhbXRvY2lzIDwtIHBub3JtKHpfbWVhbl9kYWJ0cmFtdG9jaXMsIG1lYW4obWVhbnNfZGFidHJhbXRvY2lzX3NpbSksIHNkKG1lYW5zX2RhYnRyYW10b2Npc19zaW0pLCBsb3dlci50YWlsID0gRikKCiMgRmluZCB0aGUgd2VpZ2h0ZWQgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCndlaWdodGVkX21lYW5fZGFidHJhbXRvY2lzIDwtIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShkYWJ0cmFtdG9jaXNfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCnVubGlzdChsYXBwbHkoZGFidHJhbXRvY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpCndlaWdodGVkX21lYW5zX2RhYnRyYW10b2Npc19zaW0gPC0gc2FwcGx5KDE6bGVuZ3RoKGRhYnRyYW10b2Npc19saW5fY2x1c3RfcmFuZF9saXN0KSwgZnVuY3Rpb24oeSkKICB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoZGFidHJhbXRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoZGFidHJhbXRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKSkKel93bWVhbl9kYWJ0cmFtdG9jaXMgPC0gKHdlaWdodGVkX21lYW5fZGFidHJhbXRvY2lzLW1lYW4od2VpZ2h0ZWRfbWVhbnNfZGFidHJhbXRvY2lzX3NpbSkpL3NkKHdlaWdodGVkX21lYW5zX2RhYnRyYW10b2Npc19zaW0pCnB2YWxfd21lYW5fZGFidHJhbXRvY2lzIDwtIHBub3JtKHpfd21lYW5fZGFidHJhbXRvY2lzLCBtZWFuKHdlaWdodGVkX21lYW5zX2RhYnRyYW10b2Npc19zaW0pLCBzZCh3ZWlnaHRlZF9tZWFuc19kYWJ0cmFtdG9jaXNfc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIENvbXBhcmUgZWFjaCBpbmRpdmlkdWFsIGRpc3RyaWJ1dGlvbiBvZiBtYXhlcyB0byB0aGUgb2JzZXJ2ZWQgbWF4IGJ5IHQgdGVzdCBhbmQgdHJhY2sgcHZhbAp0dGVzdF9wdmFsX2RhYnRyYW10b2NpcyA8LSBjKCkKZm9yIChpIGluIDE6bGVuZ3RoKG1lYW5zX2RhYnRyYW10b2Npc19zaW0pKXsKICBzaW1fbWF4ZXMgPC0gdW5saXN0KGxhcHBseShkYWJ0cmFtdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpCiAgdHRlc3RfcHZhbF9kYWJ0cmFtdG9jaXMgPC0gY2JpbmQodHRlc3RfcHZhbF9kYWJ0cmFtdG9jaXMsdC50ZXN0KHggPSB1bmxpc3QobGFwcGx5KGRhYnRyYW10b2Npc19saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSx5ID0gdW5saXN0KGxhcHBseShkYWJ0cmFtdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLCBhbHRlcm5hdGl2ZSA9ICdncmVhdGVyJykkcC52YWx1ZSkKfQoKIyBTYXZlIG91dHB1dHMKc2F2ZShkYWJ0cmFtdG9jaXNfbGluX2NsdXN0X2xpc3QsIGRhYnRyYW10b2Npc19saW5fY2x1c3RfcmFuZF9saXN0LHpfbWVhbl9kYWJ0cmFtdG9jaXMscHZhbF9tZWFuX2RhYnRyYW10b2Npcywgel93bWVhbl9kYWJ0cmFtdG9jaXMsIHR0ZXN0X3B2YWxfZGFidHJhbXRvY2lzLCBmaWxlID0gJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9kYWJ0cmFtdG9jaXNfc2ltX3Jlc3VsdHMuUkRhdGEnKQpybShkYWJ0cmFtdG9jaXMpCmBgYAoKIyBMb29rIGF0IHdoZXRoZXIgbGluZWFnZXMgY2x1c3RlciB0b2dldGhlciBpbiBlYWNoIGluZGl2aWR1YWwgY29uZGl0aW9uIC0gIERhYlRyYW10b0NpcwpgYGB7cn0KSWRlbnRzKGFsbF9kYXRhKSA8LSBhbGxfZGF0YSRPR19jb25kaXRpb24gIyBDaGFuZ2UgdGhlIGlkZW50cyB0byB0aGUgT0cgY29uZGl0aW9uIGZvciBzdWJzZXR0aW5nIHRvIGRhYnRyYW10b2NvY2wyCmRhYnRyYW10b2NvY2wyIDwtIHN1YnNldChhbGxfZGF0YSwgaWRlbnRzID0gJ2RhYnRyYW10b2NvY2wyJykgIyBTdWJzZXQgZG93biB0byB0aGUgZGFidHJhbXRvY29jbDIgb2JqZWN0CgpFbGJvd1Bsb3QoZGFidHJhbXRvY29jbDIpICMgVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBzZWVtcyB0byByZWFsbHkgbGV2ZWwgb2ZmIGF0IDEwCgojIFJlY2x1c3RlciB3aXRoIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgZGltZW5zaW9ucwpkYWJ0cmFtdG9jb2NsMiA8LSBGaW5kTmVpZ2hib3JzKGRhYnRyYW10b2NvY2wyLCBkaW1zID0gMToxMCkKZGFidHJhbXRvY29jbDIgPC0gRmluZENsdXN0ZXJzKGRhYnRyYW10b2NvY2wyLCByZXNvbHV0aW9uID0gMC41KQpkYWJ0cmFtdG9jb2NsMiA8LSBSdW5VTUFQKGRhYnRyYW10b2NvY2wyLCBkaW1zID0gMToxMCkKRGltUGxvdChkYWJ0cmFtdG9jb2NsMiwgcmVkdWN0aW9uID0gJ3VtYXAnKQoKIyBCdWlsZCBsaXN0IG9mIGxpbmVhZ2VzIHdpdGggYXQgbGVhc3QgNSBjZWxscyBpbiBkYWIgdHJhbSBhbmQgY2hlY2sgd2hhdCBzZXVyYXQgY2x1c3RlciB0aGUgY2VsbHMgYXJlIGluIApkYWJ0cmFtdG9jb2NsMl9saW5fY2x1c3RfbGlzdCA8LSBsaXN0KCkKCmZvciAoaSBpbiBmaXZlY2VsbF9jRE5BJERhYlRyYW10b0NvQ2wyKXsKICB0ZW1wX2RmIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoSWRlbnRzKGRhYnRyYW10b2NvY2wyKVtkYWJ0cmFtdG9jb2NsMiRMaW5lYWdlID09IGldKSkKICBjb2xuYW1lcyh0ZW1wX2RmKSA8LSBjKCdTZXVyYXRfY2x1c3QnLCAnTnVtX2NlbGxzJykKICB0ZW1wX2RmJFBjbnRfY2VsbHMgPC0gdGVtcF9kZiROdW1fY2VsbHMvc3VtKHRlbXBfZGYkTnVtX2NlbGxzKQogIGRhYnRyYW10b2NvY2wyX2xpbl9jbHVzdF9saXN0W1tpXV0gPC0gdGVtcF9kZgp9CgojIE5lZWQgdG8gZG8gYSByYW5kb20gc2FtcGxpbmcgb2YgdGhlIHNhbWUgdGhpbmcgCmRhYnRyYW10b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3QgPC0gbGlzdCgpCm51bV9pdGVyIDwtIDEwMDAgCmZvcihqIGluIDE6bnVtX2l0ZXIpewogIHNldC5zZWVkKGopCiAgZGFidHJhbXRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbal1dIDwtIGxpc3QoKQogIGZvciAoaSBpbiBmaXZlY2VsbF9jRE5BJERhYlRyYW10b0NvQ2wyKXsKICAgIG51bV9jZWxscyA8LSBsZW5ndGgoZGFidHJhbXRvY29jbDIkTGluZWFnZVtkYWJ0cmFtdG9jb2NsMiRMaW5lYWdlID09IGldKQogICAgdGVtcF9kZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHNhbXBsZShJZGVudHMoZGFidHJhbXRvY29jbDIpLCBudW1fY2VsbHMsIHJlcGxhY2UgPSBGKSkpCiAgICBjb2xuYW1lcyh0ZW1wX2RmKSA8LSBjKCdTZXVyYXRfY2x1c3QnLCAnTnVtX2NlbGxzJykKICAgIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgICBkYWJ0cmFtdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1tqXV1bW2ldXSA8LSB0ZW1wX2RmCiAgfQp9CmBgYAoKIyBTaWduaWZpY2FuY2UgdGVzdGluZyBvZiB0aGUgZGFidHJhbXRvY29jbDIgc2ltdWxhdGlvbgpgYGB7cn0KIyBGaW5kIHRoZSBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24KbWVhbl9kYWJ0cmFtdG9jb2NsMiA8LSBtZWFuKHVubGlzdChsYXBwbHkoZGFidHJhbXRvY29jbDJfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpCm1lYW5zX2RhYnRyYW10b2NvY2wyX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoZGFidHJhbXRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgbWVhbih1bmxpc3QobGFwcGx5KGRhYnRyYW10b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSkpCnpfbWVhbl9kYWJ0cmFtdG9jb2NsMiA8LSAobWVhbl9kYWJ0cmFtdG9jb2NsMi1tZWFuKG1lYW5zX2RhYnRyYW10b2NvY2wyX3NpbSkpL3NkKG1lYW5zX2RhYnRyYW10b2NvY2wyX3NpbSkKcHZhbF9tZWFuX2RhYnRyYW10b2NvY2wyIDwtIHBub3JtKHpfbWVhbl9kYWJ0cmFtdG9jb2NsMiwgbWVhbihtZWFuc19kYWJ0cmFtdG9jb2NsMl9zaW0pLCBzZChtZWFuc19kYWJ0cmFtdG9jb2NsMl9zaW0pLCBsb3dlci50YWlsID0gRikKCiMgRmluZCB0aGUgd2VpZ2h0ZWQgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCndlaWdodGVkX21lYW5fZGFidHJhbXRvY29jbDIgPC0gd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGRhYnRyYW10b2NvY2wyX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAp1bmxpc3QobGFwcGx5KGRhYnRyYW10b2NvY2wyX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpCndlaWdodGVkX21lYW5zX2RhYnRyYW10b2NvY2wyX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoZGFidHJhbXRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGRhYnRyYW10b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoZGFidHJhbXRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpKQp6X3dtZWFuX2RhYnRyYW10b2NvY2wyIDwtICh3ZWlnaHRlZF9tZWFuX2RhYnRyYW10b2NvY2wyLW1lYW4od2VpZ2h0ZWRfbWVhbnNfZGFidHJhbXRvY29jbDJfc2ltKSkvc2Qod2VpZ2h0ZWRfbWVhbnNfZGFidHJhbXRvY29jbDJfc2ltKQpwdmFsX3dtZWFuX2RhYnRyYW10b2NvY2wyIDwtIHBub3JtKHpfd21lYW5fZGFidHJhbXRvY29jbDIsIG1lYW4od2VpZ2h0ZWRfbWVhbnNfZGFidHJhbXRvY29jbDJfc2ltKSwgc2Qod2VpZ2h0ZWRfbWVhbnNfZGFidHJhbXRvY29jbDJfc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIENvbXBhcmUgZWFjaCBpbmRpdmlkdWFsIGRpc3RyaWJ1dGlvbiBvZiBtYXhlcyB0byB0aGUgb2JzZXJ2ZWQgbWF4IGJ5IHQgdGVzdCBhbmQgdHJhY2sgcHZhbAp0dGVzdF9wdmFsX2RhYnRyYW10b2NvY2wyIDwtIGMoKQpmb3IgKGkgaW4gMTpsZW5ndGgobWVhbnNfZGFidHJhbXRvY29jbDJfc2ltKSl7CiAgc2ltX21heGVzIDwtIHVubGlzdChsYXBwbHkoZGFidHJhbXRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpCiAgdHRlc3RfcHZhbF9kYWJ0cmFtdG9jb2NsMiA8LSBjYmluZCh0dGVzdF9wdmFsX2RhYnRyYW10b2NvY2wyLHQudGVzdCh4ID0gdW5saXN0KGxhcHBseShkYWJ0cmFtdG9jb2NsMl9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSx5ID0gdW5saXN0KGxhcHBseShkYWJ0cmFtdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1tpXV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksIGFsdGVybmF0aXZlID0gJ2dyZWF0ZXInKSRwLnZhbHVlKQp9CgojIFNhdmUgb3V0cHV0cwpzYXZlKGRhYnRyYW10b2NvY2wyX2xpbl9jbHVzdF9saXN0LCBkYWJ0cmFtdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0LHpfbWVhbl9kYWJ0cmFtdG9jb2NsMixwdmFsX21lYW5fZGFidHJhbXRvY29jbDIsIHpfd21lYW5fZGFidHJhbXRvY29jbDIsIHR0ZXN0X3B2YWxfZGFidHJhbXRvY29jbDIsIGZpbGUgPSAnMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL2RhYnRyYW10b2NvY2wyX3NpbV9yZXN1bHRzLlJEYXRhJykKcm0oZGFidHJhbXRvY29jbDIpCmBgYAoKIyBMb29rIGF0IHdoZXRoZXIgbGluZWFnZXMgY2x1c3RlciB0b2dldGhlciBpbiBlYWNoIGluZGl2aWR1YWwgY29uZGl0aW9uIC0gU3RhcnRpbmcgd2l0aCBEYWJUcmFtCmBgYHtyfQpJZGVudHMoYWxsX2RhdGEpIDwtIGFsbF9kYXRhJE9HX2NvbmRpdGlvbiAjIENoYW5nZSB0aGUgaWRlbnRzIHRvIHRoZSBPRyBjb25kaXRpb24gZm9yIHN1YnNldHRpbmcgdG8gY29jbDIKY29jbDIgPC0gc3Vic2V0KGFsbF9kYXRhLCBpZGVudHMgPSAnY29jbDInKSAjIFN1YnNldCBkb3duIHRvIHRoZSBjb2NsMiBvYmplY3QKCkVsYm93UGxvdChjb2NsMikgIyBUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIHNlZW1zIHRvIHJlYWxseSBsZXZlbCBvZmYgYXQgMTAKCiMgUmVjbHVzdGVyIHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBkaW1lbnNpb25zCmNvY2wyIDwtIEZpbmROZWlnaGJvcnMoY29jbDIsIGRpbXMgPSAxOjEwKQpjb2NsMiA8LSBGaW5kQ2x1c3RlcnMoY29jbDIsIHJlc29sdXRpb24gPSAwLjUpCmNvY2wyIDwtIFJ1blVNQVAoY29jbDIsIGRpbXMgPSAxOjEwKQpEaW1QbG90KGNvY2wyLCByZWR1Y3Rpb24gPSAndW1hcCcpCgojIEJ1aWxkIGxpc3Qgb2YgbGluZWFnZXMgd2l0aCBhdCBsZWFzdCA1IGNlbGxzIGluIGRhYiB0cmFtIGFuZCBjaGVjayB3aGF0IHNldXJhdCBjbHVzdGVyIHRoZSBjZWxscyBhcmUgaW4gCmNvY2wyX2xpbl9jbHVzdF9saXN0IDwtIGxpc3QoKQoKZm9yIChpIGluIGZpdmVjZWxsX2NETkEkQ29DbDIpewogIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShJZGVudHMoY29jbDIpW2NvY2wyJExpbmVhZ2UgPT0gaV0pKQogIGNvbG5hbWVzKHRlbXBfZGYpIDwtIGMoJ1NldXJhdF9jbHVzdCcsICdOdW1fY2VsbHMnKQogIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgY29jbDJfbGluX2NsdXN0X2xpc3RbW2ldXSA8LSB0ZW1wX2RmCn0KCiMgTmVlZCB0byBkbyBhIHJhbmRvbSBzYW1wbGluZyBvZiB0aGUgc2FtZSB0aGluZyAKY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCA8LSBsaXN0KCkKbnVtX2l0ZXIgPC0gMTAwMCAKZm9yKGogaW4gMTpudW1faXRlcil7CiAgc2V0LnNlZWQoaikKICBjb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1tqXV0gPC0gbGlzdCgpCiAgZm9yIChpIGluIGZpdmVjZWxsX2NETkEkQ29DbDIpewogICAgbnVtX2NlbGxzIDwtIGxlbmd0aChjb2NsMiRMaW5lYWdlW2NvY2wyJExpbmVhZ2UgPT0gaV0pCiAgICB0ZW1wX2RmIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoc2FtcGxlKElkZW50cyhjb2NsMiksIG51bV9jZWxscywgcmVwbGFjZSA9IEYpKSkKICAgIGNvbG5hbWVzKHRlbXBfZGYpIDwtIGMoJ1NldXJhdF9jbHVzdCcsICdOdW1fY2VsbHMnKQogICAgdGVtcF9kZiRQY250X2NlbGxzIDwtIHRlbXBfZGYkTnVtX2NlbGxzL3N1bSh0ZW1wX2RmJE51bV9jZWxscykKICAgIGNvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXVtbaV1dIDwtIHRlbXBfZGYKICB9Cn0KYGBgCiMgU2lnbmlmaWNhbmNlIHRlc3Rpbmcgb2YgdGhlIGNvY2wyIHNpbXVsYXRpb24KYGBge3J9CiMgRmluZCB0aGUgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCm1lYW5fY29jbDIgPC0gbWVhbih1bmxpc3QobGFwcGx5KGNvY2wyX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpKQptZWFuc19jb2NsMl9zaW0gPC0gc2FwcGx5KDE6bGVuZ3RoKGNvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIG1lYW4odW5saXN0KGxhcHBseShjb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpKQp6X21lYW5fY29jbDIgPC0gKG1lYW5fY29jbDItbWVhbihtZWFuc19jb2NsMl9zaW0pKS9zZChtZWFuc19jb2NsMl9zaW0pCnB2YWxfbWVhbl9jb2NsMiA8LSBwbm9ybSh6X21lYW5fY29jbDIsIG1lYW4obWVhbnNfY29jbDJfc2ltKSwgc2QobWVhbnNfY29jbDJfc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIEZpbmQgdGhlIHdlaWdodGVkIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgp3ZWlnaHRlZF9tZWFuX2NvY2wyIDwtIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjb2NsMl9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKdW5saXN0KGxhcHBseShjb2NsMl9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKQp3ZWlnaHRlZF9tZWFuc19jb2NsMl9zaW0gPC0gc2FwcGx5KDE6bGVuZ3RoKGNvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCiAgICAgICAgICAgICAgICB1bmxpc3QobGFwcGx5KGNvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKSkKel93bWVhbl9jb2NsMiA8LSAod2VpZ2h0ZWRfbWVhbl9jb2NsMi1tZWFuKHdlaWdodGVkX21lYW5zX2NvY2wyX3NpbSkpL3NkKHdlaWdodGVkX21lYW5zX2NvY2wyX3NpbSkKcHZhbF93bWVhbl9jb2NsMiA8LSBwbm9ybSh6X3dtZWFuX2NvY2wyLCBtZWFuKHdlaWdodGVkX21lYW5zX2NvY2wyX3NpbSksIHNkKHdlaWdodGVkX21lYW5zX2NvY2wyX3NpbSksIGxvd2VyLnRhaWwgPSBGKQoKIyBDb21wYXJlIGVhY2ggaW5kaXZpZHVhbCBkaXN0cmlidXRpb24gb2YgbWF4ZXMgdG8gdGhlIG9ic2VydmVkIG1heCBieSB0IHRlc3QgYW5kIHRyYWNrIHB2YWwKdHRlc3RfcHZhbF9jb2NsMiA8LSBjKCkKZm9yIChpIGluIDE6bGVuZ3RoKG1lYW5zX2NvY2wyX3NpbSkpewogIHNpbV9tYXhlcyA8LSB1bmxpc3QobGFwcGx5KGNvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKQogIHR0ZXN0X3B2YWxfY29jbDIgPC0gY2JpbmQodHRlc3RfcHZhbF9jb2NsMix0LnRlc3QoeCA9IHVubGlzdChsYXBwbHkoY29jbDJfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkseSA9IHVubGlzdChsYXBwbHkoY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLCBhbHRlcm5hdGl2ZSA9ICdncmVhdGVyJykkcC52YWx1ZSkKfQoKIyBTYXZlIG91dHB1dHMKc2F2ZShjb2NsMl9saW5fY2x1c3RfbGlzdCwgY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCx6X21lYW5fY29jbDIscHZhbF9tZWFuX2NvY2wyLCB6X3dtZWFuX2NvY2wyLCB0dGVzdF9wdmFsX2NvY2wyLCBmaWxlID0gJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9jb2NsMl9zaW1fcmVzdWx0cy5SRGF0YScpCnJtKGNvY2wyKQpgYGAKCiMgTG9vayBhdCB3aGV0aGVyIGxpbmVhZ2VzIGNsdXN0ZXIgdG9nZXRoZXIgaW4gZWFjaCBpbmRpdmlkdWFsIGNvbmRpdGlvbiAtIFN0YXJ0aW5nIHdpdGggQ29DbDJ0b0NvQ2wyCmBgYHtyfQpJZGVudHMoYWxsX2RhdGEpIDwtIGFsbF9kYXRhJE9HX2NvbmRpdGlvbiAjIENoYW5nZSB0aGUgaWRlbnRzIHRvIHRoZSBPRyBjb25kaXRpb24gZm9yIHN1YnNldHRpbmcgdG8gY29jbDJ0b2NvY2wyCmNvY2wydG9jb2NsMiA8LSBzdWJzZXQoYWxsX2RhdGEsIGlkZW50cyA9ICdjb2NsMnRvY29jbDInKSAjIFN1YnNldCBkb3duIHRvIHRoZSBjb2NsMnRvY29jbDIgb2JqZWN0CgpFbGJvd1Bsb3QoY29jbDJ0b2NvY2wyKSAjIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gc2VlbXMgdG8gcmVhbGx5IGxldmVsIG9mZiBhdCAxMAoKIyBSZWNsdXN0ZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMKY29jbDJ0b2NvY2wyIDwtIEZpbmROZWlnaGJvcnMoY29jbDJ0b2NvY2wyLCBkaW1zID0gMToxMCkKY29jbDJ0b2NvY2wyIDwtIEZpbmRDbHVzdGVycyhjb2NsMnRvY29jbDIsIHJlc29sdXRpb24gPSAwLjUpCmNvY2wydG9jb2NsMiA8LSBSdW5VTUFQKGNvY2wydG9jb2NsMiwgZGltcyA9IDE6MTApCkRpbVBsb3QoY29jbDJ0b2NvY2wyLCByZWR1Y3Rpb24gPSAndW1hcCcpCgojIEJ1aWxkIGxpc3Qgb2YgbGluZWFnZXMgd2l0aCBhdCBsZWFzdCA1IGNlbGxzIGluIGRhYiB0cmFtIGFuZCBjaGVjayB3aGF0IHNldXJhdCBjbHVzdGVyIHRoZSBjZWxscyBhcmUgaW4gCmNvY2wydG9jb2NsMl9saW5fY2x1c3RfbGlzdCA8LSBsaXN0KCkKCmZvciAoaSBpbiBmaXZlY2VsbF9jRE5BJENvQ2wydG9Db0NsMil7CiAgdGVtcF9kZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKElkZW50cyhjb2NsMnRvY29jbDIpW2NvY2wydG9jb2NsMiRMaW5lYWdlID09IGldKSkKICBjb2xuYW1lcyh0ZW1wX2RmKSA8LSBjKCdTZXVyYXRfY2x1c3QnLCAnTnVtX2NlbGxzJykKICB0ZW1wX2RmJFBjbnRfY2VsbHMgPC0gdGVtcF9kZiROdW1fY2VsbHMvc3VtKHRlbXBfZGYkTnVtX2NlbGxzKQogIGNvY2wydG9jb2NsMl9saW5fY2x1c3RfbGlzdFtbaV1dIDwtIHRlbXBfZGYKfQoKIyBOZWVkIHRvIGRvIGEgcmFuZG9tIHNhbXBsaW5nIG9mIHRoZSBzYW1lIHRoaW5nIApjb2NsMnRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCA8LSBsaXN0KCkKbnVtX2l0ZXIgPC0gMTAwMCAKZm9yKGogaW4gMTpudW1faXRlcil7CiAgc2V0LnNlZWQoaikKICBjb2NsMnRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbal1dIDwtIGxpc3QoKQogIGZvciAoaSBpbiBmaXZlY2VsbF9jRE5BJENvQ2wydG9Db0NsMil7CiAgICBudW1fY2VsbHMgPC0gbGVuZ3RoKGNvY2wydG9jb2NsMiRMaW5lYWdlW2NvY2wydG9jb2NsMiRMaW5lYWdlID09IGldKQogICAgdGVtcF9kZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHNhbXBsZShJZGVudHMoY29jbDJ0b2NvY2wyKSwgbnVtX2NlbGxzLCByZXBsYWNlID0gRikpKQogICAgY29sbmFtZXModGVtcF9kZikgPC0gYygnU2V1cmF0X2NsdXN0JywgJ051bV9jZWxscycpCiAgICB0ZW1wX2RmJFBjbnRfY2VsbHMgPC0gdGVtcF9kZiROdW1fY2VsbHMvc3VtKHRlbXBfZGYkTnVtX2NlbGxzKQogICAgY29jbDJ0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXVtbaV1dIDwtIHRlbXBfZGYKICB9Cn0KYGBgCiMgU2lnbmlmaWNhbmNlIHRlc3Rpbmcgb2YgdGhlIGNvY2wydG9jb2NsMiBzaW11bGF0aW9uCmBgYHtyfQojIEZpbmQgdGhlIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgptZWFuX2NvY2wydG9jb2NsMiA8LSBtZWFuKHVubGlzdChsYXBwbHkoY29jbDJ0b2NvY2wyX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpKQptZWFuc19jb2NsMnRvY29jbDJfc2ltIDwtIHNhcHBseSgxOmxlbmd0aChjb2NsMnRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgbWVhbih1bmxpc3QobGFwcGx5KGNvY2wydG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpKQp6X21lYW5fY29jbDJ0b2NvY2wyIDwtIChtZWFuX2NvY2wydG9jb2NsMi1tZWFuKG1lYW5zX2NvY2wydG9jb2NsMl9zaW0pKS9zZChtZWFuc19jb2NsMnRvY29jbDJfc2ltKQpwdmFsX21lYW5fY29jbDJ0b2NvY2wyIDwtIHBub3JtKHpfbWVhbl9jb2NsMnRvY29jbDIsIG1lYW4obWVhbnNfY29jbDJ0b2NvY2wyX3NpbSksIHNkKG1lYW5zX2NvY2wydG9jb2NsMl9zaW0pLCBsb3dlci50YWlsID0gRikKCiMgRmluZCB0aGUgd2VpZ2h0ZWQgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCndlaWdodGVkX21lYW5fY29jbDJ0b2NvY2wyIDwtIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjb2NsMnRvY29jbDJfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCnVubGlzdChsYXBwbHkoY29jbDJ0b2NvY2wyX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpCndlaWdodGVkX21lYW5zX2NvY2wydG9jb2NsMl9zaW0gPC0gc2FwcGx5KDE6bGVuZ3RoKGNvY2wydG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0KSwgZnVuY3Rpb24oeSkKICB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoY29jbDJ0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoY29jbDJ0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKSkKel93bWVhbl9jb2NsMnRvY29jbDIgPC0gKHdlaWdodGVkX21lYW5fY29jbDJ0b2NvY2wyLW1lYW4od2VpZ2h0ZWRfbWVhbnNfY29jbDJ0b2NvY2wyX3NpbSkpL3NkKHdlaWdodGVkX21lYW5zX2NvY2wydG9jb2NsMl9zaW0pCnB2YWxfd21lYW5fY29jbDJ0b2NvY2wyIDwtIHBub3JtKHpfd21lYW5fY29jbDJ0b2NvY2wyLCBtZWFuKHdlaWdodGVkX21lYW5zX2NvY2wydG9jb2NsMl9zaW0pLCBzZCh3ZWlnaHRlZF9tZWFuc19jb2NsMnRvY29jbDJfc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIENvbXBhcmUgZWFjaCBpbmRpdmlkdWFsIGRpc3RyaWJ1dGlvbiBvZiBtYXhlcyB0byB0aGUgb2JzZXJ2ZWQgbWF4IGJ5IHQgdGVzdCBhbmQgdHJhY2sgcHZhbAp0dGVzdF9wdmFsX2NvY2wydG9jb2NsMiA8LSBjKCkKZm9yIChpIGluIDE6bGVuZ3RoKG1lYW5zX2NvY2wydG9jb2NsMl9zaW0pKXsKICBzaW1fbWF4ZXMgPC0gdW5saXN0KGxhcHBseShjb2NsMnRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpCiAgdHRlc3RfcHZhbF9jb2NsMnRvY29jbDIgPC0gY2JpbmQodHRlc3RfcHZhbF9jb2NsMnRvY29jbDIsdC50ZXN0KHggPSB1bmxpc3QobGFwcGx5KGNvY2wydG9jb2NsMl9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSx5ID0gdW5saXN0KGxhcHBseShjb2NsMnRvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLCBhbHRlcm5hdGl2ZSA9ICdncmVhdGVyJykkcC52YWx1ZSkKfQoKIyBTYXZlIG91dHB1dHMKc2F2ZShjb2NsMnRvY29jbDJfbGluX2NsdXN0X2xpc3QsIGNvY2wydG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0LHpfbWVhbl9jb2NsMnRvY29jbDIscHZhbF9tZWFuX2NvY2wydG9jb2NsMiwgel93bWVhbl9jb2NsMnRvY29jbDIsIHR0ZXN0X3B2YWxfY29jbDJ0b2NvY2wyLCBmaWxlID0gJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9jb2NsMnRvY29jbDJfc2ltX3Jlc3VsdHMuUkRhdGEnKQpybShjb2NsMnRvY29jbDIpCmBgYAoKIyBMb29rIGF0IHdoZXRoZXIgbGluZWFnZXMgY2x1c3RlciB0b2dldGhlciBpbiBlYWNoIGluZGl2aWR1YWwgY29uZGl0aW9uIC0gU3RhcnRpbmcgd2l0aCBDb0NsMnRvQ2lzCmBgYHtyfQpJZGVudHMoYWxsX2RhdGEpIDwtIGFsbF9kYXRhJE9HX2NvbmRpdGlvbiAjIENoYW5nZSB0aGUgaWRlbnRzIHRvIHRoZSBPRyBjb25kaXRpb24gZm9yIHN1YnNldHRpbmcgdG8gY29jbDJ0b2Npcwpjb2NsMnRvY2lzIDwtIHN1YnNldChhbGxfZGF0YSwgaWRlbnRzID0gJ2NvY2wydG9jaXMnKSAjIFN1YnNldCBkb3duIHRvIHRoZSBjb2NsMnRvY2lzIG9iamVjdAoKRWxib3dQbG90KGNvY2wydG9jaXMpICMgVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBzZWVtcyB0byByZWFsbHkgbGV2ZWwgb2ZmIGF0IDEwCgojIFJlY2x1c3RlciB3aXRoIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgZGltZW5zaW9ucwpjb2NsMnRvY2lzIDwtIEZpbmROZWlnaGJvcnMoY29jbDJ0b2NpcywgZGltcyA9IDE6MTApCmNvY2wydG9jaXMgPC0gRmluZENsdXN0ZXJzKGNvY2wydG9jaXMsIHJlc29sdXRpb24gPSAwLjUpCmNvY2wydG9jaXMgPC0gUnVuVU1BUChjb2NsMnRvY2lzLCBkaW1zID0gMToxMCkKRGltUGxvdChjb2NsMnRvY2lzLCByZWR1Y3Rpb24gPSAndW1hcCcpCgojIEJ1aWxkIGxpc3Qgb2YgbGluZWFnZXMgd2l0aCBhdCBsZWFzdCA1IGNlbGxzIGluIGRhYiB0cmFtIGFuZCBjaGVjayB3aGF0IHNldXJhdCBjbHVzdGVyIHRoZSBjZWxscyBhcmUgaW4gCmNvY2wydG9jaXNfbGluX2NsdXN0X2xpc3QgPC0gbGlzdCgpCgpmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSRDb0NsMnRvQ2lzKXsKICB0ZW1wX2RmIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoSWRlbnRzKGNvY2wydG9jaXMpW2NvY2wydG9jaXMkTGluZWFnZSA9PSBpXSkpCiAgY29sbmFtZXModGVtcF9kZikgPC0gYygnU2V1cmF0X2NsdXN0JywgJ051bV9jZWxscycpCiAgdGVtcF9kZiRQY250X2NlbGxzIDwtIHRlbXBfZGYkTnVtX2NlbGxzL3N1bSh0ZW1wX2RmJE51bV9jZWxscykKICBjb2NsMnRvY2lzX2xpbl9jbHVzdF9saXN0W1tpXV0gPC0gdGVtcF9kZgp9CgojIE5lZWQgdG8gZG8gYSByYW5kb20gc2FtcGxpbmcgb2YgdGhlIHNhbWUgdGhpbmcgCmNvY2wydG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdCA8LSBsaXN0KCkKbnVtX2l0ZXIgPC0gMTAwMCAKZm9yKGogaW4gMTpudW1faXRlcil7CiAgc2V0LnNlZWQoaikKICBjb2NsMnRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXSA8LSBsaXN0KCkKICBmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSRDb0NsMnRvQ2lzKXsKICAgIG51bV9jZWxscyA8LSBsZW5ndGgoY29jbDJ0b2NpcyRMaW5lYWdlW2NvY2wydG9jaXMkTGluZWFnZSA9PSBpXSkKICAgIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShzYW1wbGUoSWRlbnRzKGNvY2wydG9jaXMpLCBudW1fY2VsbHMsIHJlcGxhY2UgPSBGKSkpCiAgICBjb2xuYW1lcyh0ZW1wX2RmKSA8LSBjKCdTZXVyYXRfY2x1c3QnLCAnTnVtX2NlbGxzJykKICAgIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgICBjb2NsMnRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXVtbaV1dIDwtIHRlbXBfZGYKICB9Cn0KYGBgCiMgU2lnbmlmaWNhbmNlIHRlc3Rpbmcgb2YgdGhlIGNvY2wydG9jaXMgc2ltdWxhdGlvbgpgYGB7cn0KIyBGaW5kIHRoZSBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24KbWVhbl9jb2NsMnRvY2lzIDwtIG1lYW4odW5saXN0KGxhcHBseShjb2NsMnRvY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpKQptZWFuc19jb2NsMnRvY2lzX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoY29jbDJ0b2Npc19saW5fY2x1c3RfcmFuZF9saXN0KSwgZnVuY3Rpb24oeSkKICBtZWFuKHVubGlzdChsYXBwbHkoY29jbDJ0b2Npc19saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpKQp6X21lYW5fY29jbDJ0b2NpcyA8LSAobWVhbl9jb2NsMnRvY2lzLW1lYW4obWVhbnNfY29jbDJ0b2Npc19zaW0pKS9zZChtZWFuc19jb2NsMnRvY2lzX3NpbSkKcHZhbF9tZWFuX2NvY2wydG9jaXMgPC0gcG5vcm0oel9tZWFuX2NvY2wydG9jaXMsIG1lYW4obWVhbnNfY29jbDJ0b2Npc19zaW0pLCBzZChtZWFuc19jb2NsMnRvY2lzX3NpbSksIGxvd2VyLnRhaWwgPSBGKQoKIyBGaW5kIHRoZSB3ZWlnaHRlZCBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24Kd2VpZ2h0ZWRfbWVhbl9jb2NsMnRvY2lzIDwtIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjb2NsMnRvY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAp1bmxpc3QobGFwcGx5KGNvY2wydG9jaXNfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkKd2VpZ2h0ZWRfbWVhbnNfY29jbDJ0b2Npc19zaW0gPC0gc2FwcGx5KDE6bGVuZ3RoKGNvY2wydG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNvY2wydG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAogICAgICAgICAgICAgICAgdW5saXN0KGxhcHBseShjb2NsMnRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKSkKel93bWVhbl9jb2NsMnRvY2lzIDwtICh3ZWlnaHRlZF9tZWFuX2NvY2wydG9jaXMtbWVhbih3ZWlnaHRlZF9tZWFuc19jb2NsMnRvY2lzX3NpbSkpL3NkKHdlaWdodGVkX21lYW5zX2NvY2wydG9jaXNfc2ltKQpwdmFsX3dtZWFuX2NvY2wydG9jaXMgPC0gcG5vcm0oel93bWVhbl9jb2NsMnRvY2lzLCBtZWFuKHdlaWdodGVkX21lYW5zX2NvY2wydG9jaXNfc2ltKSwgc2Qod2VpZ2h0ZWRfbWVhbnNfY29jbDJ0b2Npc19zaW0pLCBsb3dlci50YWlsID0gRikKCiMgQ29tcGFyZSBlYWNoIGluZGl2aWR1YWwgZGlzdHJpYnV0aW9uIG9mIG1heGVzIHRvIHRoZSBvYnNlcnZlZCBtYXggYnkgdCB0ZXN0IGFuZCB0cmFjayBwdmFsCnR0ZXN0X3B2YWxfY29jbDJ0b2NpcyA8LSBjKCkKZm9yIChpIGluIDE6bGVuZ3RoKG1lYW5zX2NvY2wydG9jaXNfc2ltKSl7CiAgc2ltX21heGVzIDwtIHVubGlzdChsYXBwbHkoY29jbDJ0b2Npc19saW5fY2x1c3RfcmFuZF9saXN0W1tpXV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkKICB0dGVzdF9wdmFsX2NvY2wydG9jaXMgPC0gY2JpbmQodHRlc3RfcHZhbF9jb2NsMnRvY2lzLHQudGVzdCh4ID0gdW5saXN0KGxhcHBseShjb2NsMnRvY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLHkgPSB1bmxpc3QobGFwcGx5KGNvY2wydG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLCBhbHRlcm5hdGl2ZSA9ICdncmVhdGVyJykkcC52YWx1ZSkKfQoKIyBTYXZlIG91dHB1dHMKc2F2ZShjb2NsMnRvY2lzX2xpbl9jbHVzdF9saXN0LCBjb2NsMnRvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3Qsel9tZWFuX2NvY2wydG9jaXMscHZhbF9tZWFuX2NvY2wydG9jaXMsIHpfd21lYW5fY29jbDJ0b2NpcywgdHRlc3RfcHZhbF9jb2NsMnRvY2lzLCBmaWxlID0gJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9jb2NsMnRvY2lzX3NpbV9yZXN1bHRzLlJEYXRhJykKcm0oY29jbDJ0b2NpcykKYGBgCgojIExvb2sgYXQgd2hldGhlciBsaW5lYWdlcyBjbHVzdGVyIHRvZ2V0aGVyIGluIGVhY2ggaW5kaXZpZHVhbCBjb25kaXRpb24gLSBTdGFydGluZyB3aXRoIENvQ2wydG9EYWJUcmFtCmBgYHtyfQpJZGVudHMoYWxsX2RhdGEpIDwtIGFsbF9kYXRhJE9HX2NvbmRpdGlvbiAjIENoYW5nZSB0aGUgaWRlbnRzIHRvIHRoZSBPRyBjb25kaXRpb24gZm9yIHN1YnNldHRpbmcgdG8gY29jbDJ0b2RhYnRyYW0KY29jbDJ0b2RhYnRyYW0gPC0gc3Vic2V0KGFsbF9kYXRhLCBpZGVudHMgPSAnY29jbDJ0b2RhYnRyYW0nKSAjIFN1YnNldCBkb3duIHRvIHRoZSBjb2NsMnRvZGFidHJhbSBvYmplY3QKCkVsYm93UGxvdChjb2NsMnRvZGFidHJhbSkgIyBUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIHNlZW1zIHRvIHJlYWxseSBsZXZlbCBvZmYgYXQgMTAKCiMgUmVjbHVzdGVyIHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBkaW1lbnNpb25zCmNvY2wydG9kYWJ0cmFtIDwtIEZpbmROZWlnaGJvcnMoY29jbDJ0b2RhYnRyYW0sIGRpbXMgPSAxOjEwKQpjb2NsMnRvZGFidHJhbSA8LSBGaW5kQ2x1c3RlcnMoY29jbDJ0b2RhYnRyYW0sIHJlc29sdXRpb24gPSAwLjUpCmNvY2wydG9kYWJ0cmFtIDwtIFJ1blVNQVAoY29jbDJ0b2RhYnRyYW0sIGRpbXMgPSAxOjEwKQpEaW1QbG90KGNvY2wydG9kYWJ0cmFtLCByZWR1Y3Rpb24gPSAndW1hcCcpCgojIEJ1aWxkIGxpc3Qgb2YgbGluZWFnZXMgd2l0aCBhdCBsZWFzdCA1IGNlbGxzIGluIGRhYiB0cmFtIGFuZCBjaGVjayB3aGF0IHNldXJhdCBjbHVzdGVyIHRoZSBjZWxscyBhcmUgaW4gCmNvY2wydG9kYWJ0cmFtX2xpbl9jbHVzdF9saXN0IDwtIGxpc3QoKQoKZm9yIChpIGluIGZpdmVjZWxsX2NETkEkQ29DbDJ0b0RhYlRyYW0pewogIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShJZGVudHMoY29jbDJ0b2RhYnRyYW0pW2NvY2wydG9kYWJ0cmFtJExpbmVhZ2UgPT0gaV0pKQogIGNvbG5hbWVzKHRlbXBfZGYpIDwtIGMoJ1NldXJhdF9jbHVzdCcsICdOdW1fY2VsbHMnKQogIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgY29jbDJ0b2RhYnRyYW1fbGluX2NsdXN0X2xpc3RbW2ldXSA8LSB0ZW1wX2RmCn0KCiMgTmVlZCB0byBkbyBhIHJhbmRvbSBzYW1wbGluZyBvZiB0aGUgc2FtZSB0aGluZyAKY29jbDJ0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdCA8LSBsaXN0KCkKbnVtX2l0ZXIgPC0gMTAwMCAKZm9yKGogaW4gMTpudW1faXRlcil7CiAgc2V0LnNlZWQoaikKICBjb2NsMnRvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1tqXV0gPC0gbGlzdCgpCiAgZm9yIChpIGluIGZpdmVjZWxsX2NETkEkQ29DbDJ0b0RhYlRyYW0pewogICAgbnVtX2NlbGxzIDwtIGxlbmd0aChjb2NsMnRvZGFidHJhbSRMaW5lYWdlW2NvY2wydG9kYWJ0cmFtJExpbmVhZ2UgPT0gaV0pCiAgICB0ZW1wX2RmIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoc2FtcGxlKElkZW50cyhjb2NsMnRvZGFidHJhbSksIG51bV9jZWxscywgcmVwbGFjZSA9IEYpKSkKICAgIGNvbG5hbWVzKHRlbXBfZGYpIDwtIGMoJ1NldXJhdF9jbHVzdCcsICdOdW1fY2VsbHMnKQogICAgdGVtcF9kZiRQY250X2NlbGxzIDwtIHRlbXBfZGYkTnVtX2NlbGxzL3N1bSh0ZW1wX2RmJE51bV9jZWxscykKICAgIGNvY2wydG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXVtbaV1dIDwtIHRlbXBfZGYKICB9Cn0KYGBgCiMgU2lnbmlmaWNhbmNlIHRlc3Rpbmcgb2YgdGhlIGNvY2wydG9kYWJ0cmFtIHNpbXVsYXRpb24KYGBge3J9CiMgRmluZCB0aGUgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCm1lYW5fY29jbDJ0b2RhYnRyYW0gPC0gbWVhbih1bmxpc3QobGFwcGx5KGNvY2wydG9kYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpKQptZWFuc19jb2NsMnRvZGFidHJhbV9zaW0gPC0gc2FwcGx5KDE6bGVuZ3RoKGNvY2wydG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIG1lYW4odW5saXN0KGxhcHBseShjb2NsMnRvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpKQp6X21lYW5fY29jbDJ0b2RhYnRyYW0gPC0gKG1lYW5fY29jbDJ0b2RhYnRyYW0tbWVhbihtZWFuc19jb2NsMnRvZGFidHJhbV9zaW0pKS9zZChtZWFuc19jb2NsMnRvZGFidHJhbV9zaW0pCnB2YWxfbWVhbl9jb2NsMnRvZGFidHJhbSA8LSBwbm9ybSh6X21lYW5fY29jbDJ0b2RhYnRyYW0sIG1lYW4obWVhbnNfY29jbDJ0b2RhYnRyYW1fc2ltKSwgc2QobWVhbnNfY29jbDJ0b2RhYnRyYW1fc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIEZpbmQgdGhlIHdlaWdodGVkIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgp3ZWlnaHRlZF9tZWFuX2NvY2wydG9kYWJ0cmFtIDwtIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjb2NsMnRvZGFidHJhbV9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKdW5saXN0KGxhcHBseShjb2NsMnRvZGFidHJhbV9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKQp3ZWlnaHRlZF9tZWFuc19jb2NsMnRvZGFidHJhbV9zaW0gPC0gc2FwcGx5KDE6bGVuZ3RoKGNvY2wydG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3QpLCBmdW5jdGlvbih5KQogIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjb2NsMnRvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCiAgICAgICAgICAgICAgICB1bmxpc3QobGFwcGx5KGNvY2wydG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKSkKel93bWVhbl9jb2NsMnRvZGFidHJhbSA8LSAod2VpZ2h0ZWRfbWVhbl9jb2NsMnRvZGFidHJhbS1tZWFuKHdlaWdodGVkX21lYW5zX2NvY2wydG9kYWJ0cmFtX3NpbSkpL3NkKHdlaWdodGVkX21lYW5zX2NvY2wydG9kYWJ0cmFtX3NpbSkKcHZhbF93bWVhbl9jb2NsMnRvZGFidHJhbSA8LSBwbm9ybSh6X3dtZWFuX2NvY2wydG9kYWJ0cmFtLCBtZWFuKHdlaWdodGVkX21lYW5zX2NvY2wydG9kYWJ0cmFtX3NpbSksIHNkKHdlaWdodGVkX21lYW5zX2NvY2wydG9kYWJ0cmFtX3NpbSksIGxvd2VyLnRhaWwgPSBGKQoKIyBDb21wYXJlIGVhY2ggaW5kaXZpZHVhbCBkaXN0cmlidXRpb24gb2YgbWF4ZXMgdG8gdGhlIG9ic2VydmVkIG1heCBieSB0IHRlc3QgYW5kIHRyYWNrIHB2YWwKdHRlc3RfcHZhbF9jb2NsMnRvZGFidHJhbSA8LSBjKCkKZm9yIChpIGluIDE6bGVuZ3RoKG1lYW5zX2NvY2wydG9kYWJ0cmFtX3NpbSkpewogIHNpbV9tYXhlcyA8LSB1bmxpc3QobGFwcGx5KGNvY2wydG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKQogIHR0ZXN0X3B2YWxfY29jbDJ0b2RhYnRyYW0gPC0gY2JpbmQodHRlc3RfcHZhbF9jb2NsMnRvZGFidHJhbSx0LnRlc3QoeCA9IHVubGlzdChsYXBwbHkoY29jbDJ0b2RhYnRyYW1fbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkseSA9IHVubGlzdChsYXBwbHkoY29jbDJ0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLCBhbHRlcm5hdGl2ZSA9ICdncmVhdGVyJykkcC52YWx1ZSkKfQoKIyBTYXZlIG91dHB1dHMKc2F2ZShjb2NsMnRvZGFidHJhbV9saW5fY2x1c3RfbGlzdCwgY29jbDJ0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdCx6X21lYW5fY29jbDJ0b2RhYnRyYW0scHZhbF9tZWFuX2NvY2wydG9kYWJ0cmFtLCB6X3dtZWFuX2NvY2wydG9kYWJ0cmFtLCB0dGVzdF9wdmFsX2NvY2wydG9kYWJ0cmFtLCBmaWxlID0gJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9jb2NsMnRvZGFidHJhbV9zaW1fcmVzdWx0cy5SRGF0YScpCnJtKGNvY2wydG9kYWJ0cmFtKQpgYGAKCiMgTG9vayBhdCB3aGV0aGVyIGxpbmVhZ2VzIGNsdXN0ZXIgdG9nZXRoZXIgaW4gZWFjaCBpbmRpdmlkdWFsIGNvbmRpdGlvbiAtIFN0YXJ0aW5nIHdpdGggQ2lzCmBgYHtyfQpJZGVudHMoYWxsX2RhdGEpIDwtIGFsbF9kYXRhJE9HX2NvbmRpdGlvbiAjIENoYW5nZSB0aGUgaWRlbnRzIHRvIHRoZSBPRyBjb25kaXRpb24gZm9yIHN1YnNldHRpbmcgdG8gY2lzCmNpcyA8LSBzdWJzZXQoYWxsX2RhdGEsIGlkZW50cyA9ICdjaXMnKSAjIFN1YnNldCBkb3duIHRvIHRoZSBjaXMgb2JqZWN0CgpFbGJvd1Bsb3QoY2lzKSAjIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gc2VlbXMgdG8gcmVhbGx5IGxldmVsIG9mZiBhdCAxMAoKIyBSZWNsdXN0ZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMKY2lzIDwtIEZpbmROZWlnaGJvcnMoY2lzLCBkaW1zID0gMToxMCkKY2lzIDwtIEZpbmRDbHVzdGVycyhjaXMsIHJlc29sdXRpb24gPSAwLjUpCmNpcyA8LSBSdW5VTUFQKGNpcywgZGltcyA9IDE6MTApCkRpbVBsb3QoY2lzLCByZWR1Y3Rpb24gPSAndW1hcCcpCgojIEJ1aWxkIGxpc3Qgb2YgbGluZWFnZXMgd2l0aCBhdCBsZWFzdCA1IGNlbGxzIGluIGRhYiB0cmFtIGFuZCBjaGVjayB3aGF0IHNldXJhdCBjbHVzdGVyIHRoZSBjZWxscyBhcmUgaW4gCmNpc19saW5fY2x1c3RfbGlzdCA8LSBsaXN0KCkKCmZvciAoaSBpbiBmaXZlY2VsbF9jRE5BJENpcyl7CiAgdGVtcF9kZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKElkZW50cyhjaXMpW2NpcyRMaW5lYWdlID09IGldKSkKICBjb2xuYW1lcyh0ZW1wX2RmKSA8LSBjKCdTZXVyYXRfY2x1c3QnLCAnTnVtX2NlbGxzJykKICB0ZW1wX2RmJFBjbnRfY2VsbHMgPC0gdGVtcF9kZiROdW1fY2VsbHMvc3VtKHRlbXBfZGYkTnVtX2NlbGxzKQogIGNpc19saW5fY2x1c3RfbGlzdFtbaV1dIDwtIHRlbXBfZGYKfQoKIyBOZWVkIHRvIGRvIGEgcmFuZG9tIHNhbXBsaW5nIG9mIHRoZSBzYW1lIHRoaW5nIApjaXNfbGluX2NsdXN0X3JhbmRfbGlzdCA8LSBsaXN0KCkKbnVtX2l0ZXIgPC0gMTAwMCAKZm9yKGogaW4gMTpudW1faXRlcil7CiAgc2V0LnNlZWQoaikKICBjaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbal1dIDwtIGxpc3QoKQogIGZvciAoaSBpbiBmaXZlY2VsbF9jRE5BJENpcyl7CiAgICBudW1fY2VsbHMgPC0gbGVuZ3RoKGNpcyRMaW5lYWdlW2NpcyRMaW5lYWdlID09IGldKQogICAgdGVtcF9kZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHNhbXBsZShJZGVudHMoY2lzKSwgbnVtX2NlbGxzLCByZXBsYWNlID0gRikpKQogICAgY29sbmFtZXModGVtcF9kZikgPC0gYygnU2V1cmF0X2NsdXN0JywgJ051bV9jZWxscycpCiAgICB0ZW1wX2RmJFBjbnRfY2VsbHMgPC0gdGVtcF9kZiROdW1fY2VsbHMvc3VtKHRlbXBfZGYkTnVtX2NlbGxzKQogICAgY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXVtbaV1dIDwtIHRlbXBfZGYKICB9Cn0KYGBgCiMgU2lnbmlmaWNhbmNlIHRlc3Rpbmcgb2YgdGhlIGNpcyBzaW11bGF0aW9uCmBgYHtyfQojIEZpbmQgdGhlIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgptZWFuX2NpcyA8LSBtZWFuKHVubGlzdChsYXBwbHkoY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpKQptZWFuc19jaXNfc2ltIDwtIHNhcHBseSgxOmxlbmd0aChjaXNfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgbWVhbih1bmxpc3QobGFwcGx5KGNpc19saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpKQp6X21lYW5fY2lzIDwtIChtZWFuX2Npcy1tZWFuKG1lYW5zX2Npc19zaW0pKS9zZChtZWFuc19jaXNfc2ltKQpwdmFsX21lYW5fY2lzIDwtIHBub3JtKHpfbWVhbl9jaXMsIG1lYW4obWVhbnNfY2lzX3NpbSksIHNkKG1lYW5zX2Npc19zaW0pLCBsb3dlci50YWlsID0gRikKCiMgRmluZCB0aGUgd2VpZ2h0ZWQgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCndlaWdodGVkX21lYW5fY2lzIDwtIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjaXNfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCnVubGlzdChsYXBwbHkoY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpCndlaWdodGVkX21lYW5zX2Npc19zaW0gPC0gc2FwcGx5KDE6bGVuZ3RoKGNpc19saW5fY2x1c3RfcmFuZF9saXN0KSwgZnVuY3Rpb24oeSkKICB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKSkKel93bWVhbl9jaXMgPC0gKHdlaWdodGVkX21lYW5fY2lzLW1lYW4od2VpZ2h0ZWRfbWVhbnNfY2lzX3NpbSkpL3NkKHdlaWdodGVkX21lYW5zX2Npc19zaW0pCnB2YWxfd21lYW5fY2lzIDwtIHBub3JtKHpfd21lYW5fY2lzLCBtZWFuKHdlaWdodGVkX21lYW5zX2Npc19zaW0pLCBzZCh3ZWlnaHRlZF9tZWFuc19jaXNfc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIENvbXBhcmUgZWFjaCBpbmRpdmlkdWFsIGRpc3RyaWJ1dGlvbiBvZiBtYXhlcyB0byB0aGUgb2JzZXJ2ZWQgbWF4IGJ5IHQgdGVzdCBhbmQgdHJhY2sgcHZhbAp0dGVzdF9wdmFsX2NpcyA8LSBjKCkKZm9yIChpIGluIDE6bGVuZ3RoKG1lYW5zX2Npc19zaW0pKXsKICBzaW1fbWF4ZXMgPC0gdW5saXN0KGxhcHBseShjaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpCiAgdHRlc3RfcHZhbF9jaXMgPC0gY2JpbmQodHRlc3RfcHZhbF9jaXMsdC50ZXN0KHggPSB1bmxpc3QobGFwcGx5KGNpc19saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSx5ID0gdW5saXN0KGxhcHBseShjaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLCBhbHRlcm5hdGl2ZSA9ICdncmVhdGVyJykkcC52YWx1ZSkKfQoKIyBTYXZlIG91dHB1dHMKc2F2ZShjaXNfbGluX2NsdXN0X2xpc3QsIGNpc19saW5fY2x1c3RfcmFuZF9saXN0LHpfbWVhbl9jaXMscHZhbF9tZWFuX2Npcywgel93bWVhbl9jaXMsIHR0ZXN0X3B2YWxfY2lzLCBmaWxlID0gJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9jaXNfc2ltX3Jlc3VsdHMuUkRhdGEnKQpybShjaXMpCmBgYAoKCiMgTG9vayBhdCB3aGV0aGVyIGxpbmVhZ2VzIGNsdXN0ZXIgdG9nZXRoZXIgaW4gZWFjaCBpbmRpdmlkdWFsIGNvbmRpdGlvbiAtIFN0YXJ0aW5nIHdpdGggY2lzdG9jaXMKYGBge3J9CklkZW50cyhhbGxfZGF0YSkgPC0gYWxsX2RhdGEkT0dfY29uZGl0aW9uICMgQ2hhbmdlIHRoZSBpZGVudHMgdG8gdGhlIE9HIGNvbmRpdGlvbiBmb3Igc3Vic2V0dGluZyB0byBjaXN0b2NpcwpjaXN0b2NpcyA8LSBzdWJzZXQoYWxsX2RhdGEsIGlkZW50cyA9ICdjaXN0b2NpcycpICMgU3Vic2V0IGRvd24gdG8gdGhlIGNpc3RvY2lzIG9iamVjdAoKRWxib3dQbG90KGNpc3RvY2lzKSAjIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gc2VlbXMgdG8gcmVhbGx5IGxldmVsIG9mZiBhdCAxMAoKIyBSZWNsdXN0ZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMKY2lzdG9jaXMgPC0gRmluZE5laWdoYm9ycyhjaXN0b2NpcywgZGltcyA9IDE6MTApCmNpc3RvY2lzIDwtIEZpbmRDbHVzdGVycyhjaXN0b2NpcywgcmVzb2x1dGlvbiA9IDAuNSkKY2lzdG9jaXMgPC0gUnVuVU1BUChjaXN0b2NpcywgZGltcyA9IDE6MTApCkRpbVBsb3QoY2lzdG9jaXMsIHJlZHVjdGlvbiA9ICd1bWFwJykKCiMgQnVpbGQgbGlzdCBvZiBsaW5lYWdlcyB3aXRoIGF0IGxlYXN0IDUgY2VsbHMgaW4gZGFiIHRyYW0gYW5kIGNoZWNrIHdoYXQgc2V1cmF0IGNsdXN0ZXIgdGhlIGNlbGxzIGFyZSBpbiAKY2lzdG9jaXNfbGluX2NsdXN0X2xpc3QgPC0gbGlzdCgpCgpmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSRDaXN0b0Npcyl7CiAgdGVtcF9kZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKElkZW50cyhjaXN0b2NpcylbY2lzdG9jaXMkTGluZWFnZSA9PSBpXSkpCiAgY29sbmFtZXModGVtcF9kZikgPC0gYygnU2V1cmF0X2NsdXN0JywgJ051bV9jZWxscycpCiAgdGVtcF9kZiRQY250X2NlbGxzIDwtIHRlbXBfZGYkTnVtX2NlbGxzL3N1bSh0ZW1wX2RmJE51bV9jZWxscykKICBjaXN0b2Npc19saW5fY2x1c3RfbGlzdFtbaV1dIDwtIHRlbXBfZGYKfQoKIyBOZWVkIHRvIGRvIGEgcmFuZG9tIHNhbXBsaW5nIG9mIHRoZSBzYW1lIHRoaW5nIApjaXN0b2Npc19saW5fY2x1c3RfcmFuZF9saXN0IDwtIGxpc3QoKQpudW1faXRlciA8LSAxMDAwIApmb3IoaiBpbiAxOm51bV9pdGVyKXsKICBzZXQuc2VlZChqKQogIGNpc3RvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXSA8LSBsaXN0KCkKICBmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSRDaXN0b0Npcyl7CiAgICBudW1fY2VsbHMgPC0gbGVuZ3RoKGNpc3RvY2lzJExpbmVhZ2VbY2lzdG9jaXMkTGluZWFnZSA9PSBpXSkKICAgIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShzYW1wbGUoSWRlbnRzKGNpc3RvY2lzKSwgbnVtX2NlbGxzLCByZXBsYWNlID0gRikpKQogICAgY29sbmFtZXModGVtcF9kZikgPC0gYygnU2V1cmF0X2NsdXN0JywgJ051bV9jZWxscycpCiAgICB0ZW1wX2RmJFBjbnRfY2VsbHMgPC0gdGVtcF9kZiROdW1fY2VsbHMvc3VtKHRlbXBfZGYkTnVtX2NlbGxzKQogICAgY2lzdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbal1dW1tpXV0gPC0gdGVtcF9kZgogIH0KfQpgYGAKIyBTaWduaWZpY2FuY2UgdGVzdGluZyBvZiB0aGUgY2lzdG9jaXMgc2ltdWxhdGlvbgpgYGB7cn0KIyBGaW5kIHRoZSBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24KbWVhbl9jaXN0b2NpcyA8LSBtZWFuKHVubGlzdChsYXBwbHkoY2lzdG9jaXNfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpCm1lYW5zX2Npc3RvY2lzX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoY2lzdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgbWVhbih1bmxpc3QobGFwcGx5KGNpc3RvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSkpCnpfbWVhbl9jaXN0b2NpcyA8LSAobWVhbl9jaXN0b2Npcy1tZWFuKG1lYW5zX2Npc3RvY2lzX3NpbSkpL3NkKG1lYW5zX2Npc3RvY2lzX3NpbSkKcHZhbF9tZWFuX2Npc3RvY2lzIDwtIHBub3JtKHpfbWVhbl9jaXN0b2NpcywgbWVhbihtZWFuc19jaXN0b2Npc19zaW0pLCBzZChtZWFuc19jaXN0b2Npc19zaW0pLCBsb3dlci50YWlsID0gRikKCiMgRmluZCB0aGUgd2VpZ2h0ZWQgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCndlaWdodGVkX21lYW5fY2lzdG9jaXMgPC0gd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNpc3RvY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAp1bmxpc3QobGFwcGx5KGNpc3RvY2lzX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpCndlaWdodGVkX21lYW5zX2Npc3RvY2lzX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoY2lzdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNpc3RvY2lzX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoY2lzdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpKQp6X3dtZWFuX2Npc3RvY2lzIDwtICh3ZWlnaHRlZF9tZWFuX2Npc3RvY2lzLW1lYW4od2VpZ2h0ZWRfbWVhbnNfY2lzdG9jaXNfc2ltKSkvc2Qod2VpZ2h0ZWRfbWVhbnNfY2lzdG9jaXNfc2ltKQpwdmFsX3dtZWFuX2Npc3RvY2lzIDwtIHBub3JtKHpfd21lYW5fY2lzdG9jaXMsIG1lYW4od2VpZ2h0ZWRfbWVhbnNfY2lzdG9jaXNfc2ltKSwgc2Qod2VpZ2h0ZWRfbWVhbnNfY2lzdG9jaXNfc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIENvbXBhcmUgZWFjaCBpbmRpdmlkdWFsIGRpc3RyaWJ1dGlvbiBvZiBtYXhlcyB0byB0aGUgb2JzZXJ2ZWQgbWF4IGJ5IHQgdGVzdCBhbmQgdHJhY2sgcHZhbAp0dGVzdF9wdmFsX2Npc3RvY2lzIDwtIGMoKQpmb3IgKGkgaW4gMTpsZW5ndGgobWVhbnNfY2lzdG9jaXNfc2ltKSl7CiAgc2ltX21heGVzIDwtIHVubGlzdChsYXBwbHkoY2lzdG9jaXNfbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpCiAgdHRlc3RfcHZhbF9jaXN0b2NpcyA8LSBjYmluZCh0dGVzdF9wdmFsX2Npc3RvY2lzLHQudGVzdCh4ID0gdW5saXN0KGxhcHBseShjaXN0b2Npc19saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSx5ID0gdW5saXN0KGxhcHBseShjaXN0b2Npc19saW5fY2x1c3RfcmFuZF9saXN0W1tpXV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksIGFsdGVybmF0aXZlID0gJ2dyZWF0ZXInKSRwLnZhbHVlKQp9CgojIFNhdmUgb3V0cHV0cwpzYXZlKGNpc3RvY2lzX2xpbl9jbHVzdF9saXN0LCBjaXN0b2Npc19saW5fY2x1c3RfcmFuZF9saXN0LHpfbWVhbl9jaXN0b2NpcyxwdmFsX21lYW5fY2lzdG9jaXMsIHpfd21lYW5fY2lzdG9jaXMsIHR0ZXN0X3B2YWxfY2lzdG9jaXMsIGZpbGUgPSAnMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL2Npc3RvY2lzX3NpbV9yZXN1bHRzLlJEYXRhJykKcm0oY2lzdG9jaXMpCmBgYAoKCiMgTG9vayBhdCB3aGV0aGVyIGxpbmVhZ2VzIGNsdXN0ZXIgdG9nZXRoZXIgaW4gZWFjaCBpbmRpdmlkdWFsIGNvbmRpdGlvbiAtIFN0YXJ0aW5nIHdpdGggY2lzdG9kYWJ0cmFtCmBgYHtyfQpJZGVudHMoYWxsX2RhdGEpIDwtIGFsbF9kYXRhJE9HX2NvbmRpdGlvbiAjIENoYW5nZSB0aGUgaWRlbnRzIHRvIHRoZSBPRyBjb25kaXRpb24gZm9yIHN1YnNldHRpbmcgdG8gY2lzdG9kYWJ0cmFtCmNpc3RvZGFidHJhbSA8LSBzdWJzZXQoYWxsX2RhdGEsIGlkZW50cyA9ICdjaXN0b2RhYnRyYW0nKSAjIFN1YnNldCBkb3duIHRvIHRoZSBjaXN0b2RhYnRyYW0gb2JqZWN0CgpFbGJvd1Bsb3QoY2lzdG9kYWJ0cmFtKSAjIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gc2VlbXMgdG8gcmVhbGx5IGxldmVsIG9mZiBhdCAxMAoKIyBSZWNsdXN0ZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMKY2lzdG9kYWJ0cmFtIDwtIEZpbmROZWlnaGJvcnMoY2lzdG9kYWJ0cmFtLCBkaW1zID0gMToxMCkKY2lzdG9kYWJ0cmFtIDwtIEZpbmRDbHVzdGVycyhjaXN0b2RhYnRyYW0sIHJlc29sdXRpb24gPSAwLjUpCmNpc3RvZGFidHJhbSA8LSBSdW5VTUFQKGNpc3RvZGFidHJhbSwgZGltcyA9IDE6MTApCkRpbVBsb3QoY2lzdG9kYWJ0cmFtLCByZWR1Y3Rpb24gPSAndW1hcCcpCgojIEJ1aWxkIGxpc3Qgb2YgbGluZWFnZXMgd2l0aCBhdCBsZWFzdCA1IGNlbGxzIGluIGRhYiB0cmFtIGFuZCBjaGVjayB3aGF0IHNldXJhdCBjbHVzdGVyIHRoZSBjZWxscyBhcmUgaW4gCmNpc3RvZGFidHJhbV9saW5fY2x1c3RfbGlzdCA8LSBsaXN0KCkKCmZvciAoaSBpbiBmaXZlY2VsbF9jRE5BJENpc3RvRGFiVHJhbSl7CiAgdGVtcF9kZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKElkZW50cyhjaXN0b2RhYnRyYW0pW2Npc3RvZGFidHJhbSRMaW5lYWdlID09IGldKSkKICBjb2xuYW1lcyh0ZW1wX2RmKSA8LSBjKCdTZXVyYXRfY2x1c3QnLCAnTnVtX2NlbGxzJykKICB0ZW1wX2RmJFBjbnRfY2VsbHMgPC0gdGVtcF9kZiROdW1fY2VsbHMvc3VtKHRlbXBfZGYkTnVtX2NlbGxzKQogIGNpc3RvZGFidHJhbV9saW5fY2x1c3RfbGlzdFtbaV1dIDwtIHRlbXBfZGYKfQoKIyBOZWVkIHRvIGRvIGEgcmFuZG9tIHNhbXBsaW5nIG9mIHRoZSBzYW1lIHRoaW5nIApjaXN0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdCA8LSBsaXN0KCkKbnVtX2l0ZXIgPC0gMTAwMCAKZm9yKGogaW4gMTpudW1faXRlcil7CiAgc2V0LnNlZWQoaikKICBjaXN0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdFtbal1dIDwtIGxpc3QoKQogIGZvciAoaSBpbiBmaXZlY2VsbF9jRE5BJENpc3RvRGFiVHJhbSl7CiAgICBudW1fY2VsbHMgPC0gbGVuZ3RoKGNpc3RvZGFidHJhbSRMaW5lYWdlW2Npc3RvZGFidHJhbSRMaW5lYWdlID09IGldKQogICAgdGVtcF9kZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHNhbXBsZShJZGVudHMoY2lzdG9kYWJ0cmFtKSwgbnVtX2NlbGxzLCByZXBsYWNlID0gRikpKQogICAgY29sbmFtZXModGVtcF9kZikgPC0gYygnU2V1cmF0X2NsdXN0JywgJ051bV9jZWxscycpCiAgICB0ZW1wX2RmJFBjbnRfY2VsbHMgPC0gdGVtcF9kZiROdW1fY2VsbHMvc3VtKHRlbXBfZGYkTnVtX2NlbGxzKQogICAgY2lzdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXVtbaV1dIDwtIHRlbXBfZGYKICB9Cn0KYGBgCiMgU2lnbmlmaWNhbmNlIHRlc3Rpbmcgb2YgdGhlIGNpc3RvZGFidHJhbSBzaW11bGF0aW9uCmBgYHtyfQojIEZpbmQgdGhlIG1lYW4gb2YgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBjZWxscyBpbiBhIHNpbmdsZSBjbHVzdGVyIHBlciBsaW5lYWdlIGluIGVhY2ggc2ltdWxhdGlvbgptZWFuX2Npc3RvZGFidHJhbSA8LSBtZWFuKHVubGlzdChsYXBwbHkoY2lzdG9kYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpKQptZWFuc19jaXN0b2RhYnRyYW1fc2ltIDwtIHNhcHBseSgxOmxlbmd0aChjaXN0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgbWVhbih1bmxpc3QobGFwcGx5KGNpc3RvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpKQp6X21lYW5fY2lzdG9kYWJ0cmFtIDwtIChtZWFuX2Npc3RvZGFidHJhbS1tZWFuKG1lYW5zX2Npc3RvZGFidHJhbV9zaW0pKS9zZChtZWFuc19jaXN0b2RhYnRyYW1fc2ltKQpwdmFsX21lYW5fY2lzdG9kYWJ0cmFtIDwtIHBub3JtKHpfbWVhbl9jaXN0b2RhYnRyYW0sIG1lYW4obWVhbnNfY2lzdG9kYWJ0cmFtX3NpbSksIHNkKG1lYW5zX2Npc3RvZGFidHJhbV9zaW0pLCBsb3dlci50YWlsID0gRikKCiMgRmluZCB0aGUgd2VpZ2h0ZWQgbWVhbiBvZiB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGEgc2luZ2xlIGNsdXN0ZXIgcGVyIGxpbmVhZ2UgaW4gZWFjaCBzaW11bGF0aW9uCndlaWdodGVkX21lYW5fY2lzdG9kYWJ0cmFtIDwtIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjaXN0b2RhYnRyYW1fbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSksCnVubGlzdChsYXBwbHkoY2lzdG9kYWJ0cmFtX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBzdW0oeCROdW1fY2VsbHMpKSkpCndlaWdodGVkX21lYW5zX2Npc3RvZGFidHJhbV9zaW0gPC0gc2FwcGx5KDE6bGVuZ3RoKGNpc3RvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0KSwgZnVuY3Rpb24oeSkKICB3ZWlnaHRlZC5tZWFuKHVubGlzdChsYXBwbHkoY2lzdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSwKICAgICAgICAgICAgICAgIHVubGlzdChsYXBwbHkoY2lzdG9kYWJ0cmFtX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKSkKel93bWVhbl9jaXN0b2RhYnRyYW0gPC0gKHdlaWdodGVkX21lYW5fY2lzdG9kYWJ0cmFtLW1lYW4od2VpZ2h0ZWRfbWVhbnNfY2lzdG9kYWJ0cmFtX3NpbSkpL3NkKHdlaWdodGVkX21lYW5zX2Npc3RvZGFidHJhbV9zaW0pCnB2YWxfd21lYW5fY2lzdG9kYWJ0cmFtIDwtIHBub3JtKHpfd21lYW5fY2lzdG9kYWJ0cmFtLCBtZWFuKHdlaWdodGVkX21lYW5zX2Npc3RvZGFidHJhbV9zaW0pLCBzZCh3ZWlnaHRlZF9tZWFuc19jaXN0b2RhYnRyYW1fc2ltKSwgbG93ZXIudGFpbCA9IEYpCgojIENvbXBhcmUgZWFjaCBpbmRpdmlkdWFsIGRpc3RyaWJ1dGlvbiBvZiBtYXhlcyB0byB0aGUgb2JzZXJ2ZWQgbWF4IGJ5IHQgdGVzdCBhbmQgdHJhY2sgcHZhbAp0dGVzdF9wdmFsX2Npc3RvZGFidHJhbSA8LSBjKCkKZm9yIChpIGluIDE6bGVuZ3RoKG1lYW5zX2Npc3RvZGFidHJhbV9zaW0pKXsKICBzaW1fbWF4ZXMgPC0gdW5saXN0KGxhcHBseShjaXN0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpCiAgdHRlc3RfcHZhbF9jaXN0b2RhYnRyYW0gPC0gY2JpbmQodHRlc3RfcHZhbF9jaXN0b2RhYnRyYW0sdC50ZXN0KHggPSB1bmxpc3QobGFwcGx5KGNpc3RvZGFidHJhbV9saW5fY2x1c3RfbGlzdCwgZnVuY3Rpb24oeCkgbWF4KHgkUGNudF9jZWxscykpKSx5ID0gdW5saXN0KGxhcHBseShjaXN0b2RhYnRyYW1fbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLCBhbHRlcm5hdGl2ZSA9ICdncmVhdGVyJykkcC52YWx1ZSkKfQoKIyBTYXZlIG91dHB1dHMKc2F2ZShjaXN0b2RhYnRyYW1fbGluX2NsdXN0X2xpc3QsIGNpc3RvZGFidHJhbV9saW5fY2x1c3RfcmFuZF9saXN0LHpfbWVhbl9jaXN0b2RhYnRyYW0scHZhbF9tZWFuX2Npc3RvZGFidHJhbSwgel93bWVhbl9jaXN0b2RhYnRyYW0sIHR0ZXN0X3B2YWxfY2lzdG9kYWJ0cmFtLCBmaWxlID0gJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9jaXN0b2RhYnRyYW1fc2ltX3Jlc3VsdHMuUkRhdGEnKQpybShjaXN0b2RhYnRyYW0pCmBgYAoKIyBMb29rIGF0IHdoZXRoZXIgbGluZWFnZXMgY2x1c3RlciB0b2dldGhlciBpbiBlYWNoIGluZGl2aWR1YWwgY29uZGl0aW9uIC0gU3RhcnRpbmcgd2l0aCBjaXN0b2NvY2wyCmBgYHtyfQpJZGVudHMoYWxsX2RhdGEpIDwtIGFsbF9kYXRhJE9HX2NvbmRpdGlvbiAjIENoYW5nZSB0aGUgaWRlbnRzIHRvIHRoZSBPRyBjb25kaXRpb24gZm9yIHN1YnNldHRpbmcgdG8gY2lzdG9jb2NsMgpjaXN0b2NvY2wyIDwtIHN1YnNldChhbGxfZGF0YSwgaWRlbnRzID0gJ2Npc3RvY29jbDInKSAjIFN1YnNldCBkb3duIHRvIHRoZSBjaXN0b2NvY2wyIG9iamVjdAoKRWxib3dQbG90KGNpc3RvY29jbDIpICMgVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBzZWVtcyB0byByZWFsbHkgbGV2ZWwgb2ZmIGF0IDEwCgojIFJlY2x1c3RlciB3aXRoIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgZGltZW5zaW9ucwpjaXN0b2NvY2wyIDwtIEZpbmROZWlnaGJvcnMoY2lzdG9jb2NsMiwgZGltcyA9IDE6MTApCmNpc3RvY29jbDIgPC0gRmluZENsdXN0ZXJzKGNpc3RvY29jbDIsIHJlc29sdXRpb24gPSAwLjUpCmNpc3RvY29jbDIgPC0gUnVuVU1BUChjaXN0b2NvY2wyLCBkaW1zID0gMToxMCkKRGltUGxvdChjaXN0b2NvY2wyLCByZWR1Y3Rpb24gPSAndW1hcCcpCgojIEJ1aWxkIGxpc3Qgb2YgbGluZWFnZXMgd2l0aCBhdCBsZWFzdCA1IGNlbGxzIGluIGRhYiB0cmFtIGFuZCBjaGVjayB3aGF0IHNldXJhdCBjbHVzdGVyIHRoZSBjZWxscyBhcmUgaW4gCmNpc3RvY29jbDJfbGluX2NsdXN0X2xpc3QgPC0gbGlzdCgpCgpmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSRDaXN0b0NvQ2wyKXsKICB0ZW1wX2RmIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoSWRlbnRzKGNpc3RvY29jbDIpW2Npc3RvY29jbDIkTGluZWFnZSA9PSBpXSkpCiAgY29sbmFtZXModGVtcF9kZikgPC0gYygnU2V1cmF0X2NsdXN0JywgJ051bV9jZWxscycpCiAgdGVtcF9kZiRQY250X2NlbGxzIDwtIHRlbXBfZGYkTnVtX2NlbGxzL3N1bSh0ZW1wX2RmJE51bV9jZWxscykKICBjaXN0b2NvY2wyX2xpbl9jbHVzdF9saXN0W1tpXV0gPC0gdGVtcF9kZgp9CgojIE5lZWQgdG8gZG8gYSByYW5kb20gc2FtcGxpbmcgb2YgdGhlIHNhbWUgdGhpbmcgCmNpc3RvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCA8LSBsaXN0KCkKbnVtX2l0ZXIgPC0gMTAwMCAKZm9yKGogaW4gMTpudW1faXRlcil7CiAgc2V0LnNlZWQoaikKICBjaXN0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXSA8LSBsaXN0KCkKICBmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSRDaXN0b0NvQ2wyKXsKICAgIG51bV9jZWxscyA8LSBsZW5ndGgoY2lzdG9jb2NsMiRMaW5lYWdlW2Npc3RvY29jbDIkTGluZWFnZSA9PSBpXSkKICAgIHRlbXBfZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShzYW1wbGUoSWRlbnRzKGNpc3RvY29jbDIpLCBudW1fY2VsbHMsIHJlcGxhY2UgPSBGKSkpCiAgICBjb2xuYW1lcyh0ZW1wX2RmKSA8LSBjKCdTZXVyYXRfY2x1c3QnLCAnTnVtX2NlbGxzJykKICAgIHRlbXBfZGYkUGNudF9jZWxscyA8LSB0ZW1wX2RmJE51bV9jZWxscy9zdW0odGVtcF9kZiROdW1fY2VsbHMpCiAgICBjaXN0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW2pdXVtbaV1dIDwtIHRlbXBfZGYKICB9Cn0KYGBgCiMgU2lnbmlmaWNhbmNlIHRlc3Rpbmcgb2YgdGhlIGNpc3RvY29jbDIgc2ltdWxhdGlvbgpgYGB7cn0KIyBGaW5kIHRoZSBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24KbWVhbl9jaXN0b2NvY2wyIDwtIG1lYW4odW5saXN0KGxhcHBseShjaXN0b2NvY2wyX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpKQptZWFuc19jaXN0b2NvY2wyX3NpbSA8LSBzYXBwbHkoMTpsZW5ndGgoY2lzdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0KSwgZnVuY3Rpb24oeSkKICBtZWFuKHVubGlzdChsYXBwbHkoY2lzdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1t5XV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkpKQp6X21lYW5fY2lzdG9jb2NsMiA8LSAobWVhbl9jaXN0b2NvY2wyLW1lYW4obWVhbnNfY2lzdG9jb2NsMl9zaW0pKS9zZChtZWFuc19jaXN0b2NvY2wyX3NpbSkKcHZhbF9tZWFuX2Npc3RvY29jbDIgPC0gcG5vcm0oel9tZWFuX2Npc3RvY29jbDIsIG1lYW4obWVhbnNfY2lzdG9jb2NsMl9zaW0pLCBzZChtZWFuc19jaXN0b2NvY2wyX3NpbSksIGxvd2VyLnRhaWwgPSBGKQoKIyBGaW5kIHRoZSB3ZWlnaHRlZCBtZWFuIG9mIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gYSBzaW5nbGUgY2x1c3RlciBwZXIgbGluZWFnZSBpbiBlYWNoIHNpbXVsYXRpb24Kd2VpZ2h0ZWRfbWVhbl9jaXN0b2NvY2wyIDwtIHdlaWdodGVkLm1lYW4odW5saXN0KGxhcHBseShjaXN0b2NvY2wyX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAp1bmxpc3QobGFwcGx5KGNpc3RvY29jbDJfbGluX2NsdXN0X2xpc3QsIGZ1bmN0aW9uKHgpIHN1bSh4JE51bV9jZWxscykpKSkKd2VpZ2h0ZWRfbWVhbnNfY2lzdG9jb2NsMl9zaW0gPC0gc2FwcGx5KDE6bGVuZ3RoKGNpc3RvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdCksIGZ1bmN0aW9uKHkpCiAgd2VpZ2h0ZWQubWVhbih1bmxpc3QobGFwcGx5KGNpc3RvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbeV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLAogICAgICAgICAgICAgICAgdW5saXN0KGxhcHBseShjaXN0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3RbW3ldXSwgZnVuY3Rpb24oeCkgc3VtKHgkTnVtX2NlbGxzKSkpKSkKel93bWVhbl9jaXN0b2NvY2wyIDwtICh3ZWlnaHRlZF9tZWFuX2Npc3RvY29jbDItbWVhbih3ZWlnaHRlZF9tZWFuc19jaXN0b2NvY2wyX3NpbSkpL3NkKHdlaWdodGVkX21lYW5zX2Npc3RvY29jbDJfc2ltKQpwdmFsX3dtZWFuX2Npc3RvY29jbDIgPC0gcG5vcm0oel93bWVhbl9jaXN0b2NvY2wyLCBtZWFuKHdlaWdodGVkX21lYW5zX2Npc3RvY29jbDJfc2ltKSwgc2Qod2VpZ2h0ZWRfbWVhbnNfY2lzdG9jb2NsMl9zaW0pLCBsb3dlci50YWlsID0gRikKCiMgQ29tcGFyZSBlYWNoIGluZGl2aWR1YWwgZGlzdHJpYnV0aW9uIG9mIG1heGVzIHRvIHRoZSBvYnNlcnZlZCBtYXggYnkgdCB0ZXN0IGFuZCB0cmFjayBwdmFsCnR0ZXN0X3B2YWxfY2lzdG9jb2NsMiA8LSBjKCkKZm9yIChpIGluIDE6bGVuZ3RoKG1lYW5zX2Npc3RvY29jbDJfc2ltKSl7CiAgc2ltX21heGVzIDwtIHVubGlzdChsYXBwbHkoY2lzdG9jb2NsMl9saW5fY2x1c3RfcmFuZF9saXN0W1tpXV0sIGZ1bmN0aW9uKHgpIG1heCh4JFBjbnRfY2VsbHMpKSkKICB0dGVzdF9wdmFsX2Npc3RvY29jbDIgPC0gY2JpbmQodHRlc3RfcHZhbF9jaXN0b2NvY2wyLHQudGVzdCh4ID0gdW5saXN0KGxhcHBseShjaXN0b2NvY2wyX2xpbl9jbHVzdF9saXN0LCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLHkgPSB1bmxpc3QobGFwcGx5KGNpc3RvY29jbDJfbGluX2NsdXN0X3JhbmRfbGlzdFtbaV1dLCBmdW5jdGlvbih4KSBtYXgoeCRQY250X2NlbGxzKSkpLCBhbHRlcm5hdGl2ZSA9ICdncmVhdGVyJykkcC52YWx1ZSkKfQoKIyBTYXZlIG91dHB1dHMKc2F2ZShjaXN0b2NvY2wyX2xpbl9jbHVzdF9saXN0LCBjaXN0b2NvY2wyX2xpbl9jbHVzdF9yYW5kX2xpc3Qsel9tZWFuX2Npc3RvY29jbDIscHZhbF9tZWFuX2Npc3RvY29jbDIsIHpfd21lYW5fY2lzdG9jb2NsMiwgdHRlc3RfcHZhbF9jaXN0b2NvY2wyLCBmaWxlID0gJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9jaXN0b2NvY2wyX3NpbV9yZXN1bHRzLlJEYXRhJykKcm0oY2lzdG9jb2NsMikKYGBgCgojIEJ1aWxkIGRhdGFmcmFtZSBvZiBvdmVyYWxsIHNpbXVsYXRpb24gcmVzdWx0cwpgYGB7cn0Kc2ltX3Jlc3VsdHMgPC0gcmJpbmQoCiAgZGFidHJhbSA8LSBkYXRhLmZyYW1lKCJNZWFuX1pzY29yZSIgPSB6X21lYW5fZGFidHJhbSwgIk1lYW5fcHZhbCIgPSBwdmFsX21lYW5fZGFidHJhbSwgIldlaWdodGVkX01lYW5fWnNjb3JlIiA9IHpfd21lYW5fZGFidHJhbSwgIldlaWdodGVkX01lYW5fcHZhbCIgPSBwdmFsX3dtZWFuX2RhYnRyYW0sIHR0ZXN0X3NpbXNfc2lnID0gc3VtKHR0ZXN0X3B2YWxfZGFidHJhbSA8PSAwLjA1KSksCiAgZGFidHJhbXRvZGFidHJhbSA8LSBkYXRhLmZyYW1lKCJNZWFuX1pzY29yZSIgPSB6X21lYW5fZGFidHJhbXRvZGFidHJhbSwgIk1lYW5fcHZhbCIgPSBwdmFsX21lYW5fZGFidHJhbXRvZGFidHJhbSwgIldlaWdodGVkX01lYW5fWnNjb3JlIiA9IHpfd21lYW5fZGFidHJhbXRvZGFidHJhbSwgIldlaWdodGVkX01lYW5fcHZhbCIgPSBwdmFsX3dtZWFuX2RhYnRyYW10b2RhYnRyYW0sIHR0ZXN0X3NpbXNfc2lnID0gc3VtKHR0ZXN0X3B2YWxfZGFidHJhbXRvZGFidHJhbSA8PSAwLjA1KSksCiAgZGFidHJhbXRvY29jbDIgPC0gZGF0YS5mcmFtZSgiTWVhbl9ac2NvcmUiID0gel9tZWFuX2RhYnRyYW10b2NvY2wyLCAiTWVhbl9wdmFsIiA9IHB2YWxfbWVhbl9kYWJ0cmFtdG9jb2NsMiwgIldlaWdodGVkX01lYW5fWnNjb3JlIiA9IHpfd21lYW5fZGFidHJhbXRvY29jbDIsICJXZWlnaHRlZF9NZWFuX3B2YWwiID0gcHZhbF93bWVhbl9kYWJ0cmFtdG9jb2NsMiwgdHRlc3Rfc2ltc19zaWcgPSBzdW0odHRlc3RfcHZhbF9kYWJ0cmFtdG9jb2NsMiA8PSAwLjA1KSksCiAgZGFidHJhbXRvY2lzIDwtIGRhdGEuZnJhbWUoIk1lYW5fWnNjb3JlIiA9IHpfbWVhbl9kYWJ0cmFtdG9jaXMsICJNZWFuX3B2YWwiID0gcHZhbF9tZWFuX2RhYnRyYW10b2NpcywgIldlaWdodGVkX01lYW5fWnNjb3JlIiA9IHpfd21lYW5fZGFidHJhbXRvY2lzLCAiV2VpZ2h0ZWRfTWVhbl9wdmFsIiA9IHB2YWxfd21lYW5fZGFidHJhbXRvY2lzLCB0dGVzdF9zaW1zX3NpZyA9IHN1bSh0dGVzdF9wdmFsX2RhYnRyYW10b2NpcyA8PSAwLjA1KSksCiAgY2lzIDwtIGRhdGEuZnJhbWUoIk1lYW5fWnNjb3JlIiA9IHpfbWVhbl9jaXMsICJNZWFuX3B2YWwiID0gcHZhbF9tZWFuX2NpcywgIldlaWdodGVkX01lYW5fWnNjb3JlIiA9IHpfd21lYW5fY2lzLCAiV2VpZ2h0ZWRfTWVhbl9wdmFsIiA9IHB2YWxfd21lYW5fY2lzLCB0dGVzdF9zaW1zX3NpZyA9IHN1bSh0dGVzdF9wdmFsX2NpcyA8PSAwLjA1KSksCiAgY2lzdG9kYWJ0cmFtIDwtIGRhdGEuZnJhbWUoIk1lYW5fWnNjb3JlIiA9IHpfbWVhbl9jaXN0b2RhYnRyYW0sICJNZWFuX3B2YWwiID0gcHZhbF9tZWFuX2Npc3RvZGFidHJhbSwgIldlaWdodGVkX01lYW5fWnNjb3JlIiA9IHpfd21lYW5fY2lzdG9kYWJ0cmFtLCAiV2VpZ2h0ZWRfTWVhbl9wdmFsIiA9IHB2YWxfd21lYW5fY2lzdG9kYWJ0cmFtLCB0dGVzdF9zaW1zX3NpZyA9IHN1bSh0dGVzdF9wdmFsX2Npc3RvZGFidHJhbSA8PSAwLjA1KSksCiAgY2lzdG9jb2NsMiA8LSBkYXRhLmZyYW1lKCJNZWFuX1pzY29yZSIgPSB6X21lYW5fY2lzdG9jb2NsMiwgIk1lYW5fcHZhbCIgPSBwdmFsX21lYW5fY2lzdG9jb2NsMiwgIldlaWdodGVkX01lYW5fWnNjb3JlIiA9IHpfd21lYW5fY2lzdG9jb2NsMiwgIldlaWdodGVkX01lYW5fcHZhbCIgPSBwdmFsX3dtZWFuX2Npc3RvY29jbDIsIHR0ZXN0X3NpbXNfc2lnID0gc3VtKHR0ZXN0X3B2YWxfY2lzdG9jb2NsMiA8PSAwLjA1KSksCiAgY2lzdG9jaXMgPC0gZGF0YS5mcmFtZSgiTWVhbl9ac2NvcmUiID0gel9tZWFuX2Npc3RvY2lzLCAiTWVhbl9wdmFsIiA9IHB2YWxfbWVhbl9jaXN0b2NpcywgIldlaWdodGVkX01lYW5fWnNjb3JlIiA9IHpfd21lYW5fY2lzdG9jaXMsICJXZWlnaHRlZF9NZWFuX3B2YWwiID0gcHZhbF93bWVhbl9jaXN0b2NpcywgdHRlc3Rfc2ltc19zaWcgPSBzdW0odHRlc3RfcHZhbF9jaXN0b2NpcyA8PSAwLjA1KSksCiAgY29jbDIgPC0gZGF0YS5mcmFtZSgiTWVhbl9ac2NvcmUiID0gel9tZWFuX2NvY2wyLCAiTWVhbl9wdmFsIiA9IHB2YWxfbWVhbl9jb2NsMiwgIldlaWdodGVkX01lYW5fWnNjb3JlIiA9IHpfd21lYW5fY29jbDIsICJXZWlnaHRlZF9NZWFuX3B2YWwiID0gcHZhbF93bWVhbl9jb2NsMiwgdHRlc3Rfc2ltc19zaWcgPSBzdW0odHRlc3RfcHZhbF9jb2NsMiA8PSAwLjA1KSksCiAgY29jbDJ0b2RhYnRyYW0gPC0gZGF0YS5mcmFtZSgiTWVhbl9ac2NvcmUiID0gel9tZWFuX2NvY2wydG9kYWJ0cmFtLCAiTWVhbl9wdmFsIiA9IHB2YWxfbWVhbl9jb2NsMnRvZGFidHJhbSwgIldlaWdodGVkX01lYW5fWnNjb3JlIiA9IHpfd21lYW5fY29jbDJ0b2RhYnRyYW0sICJXZWlnaHRlZF9NZWFuX3B2YWwiID0gcHZhbF93bWVhbl9jb2NsMnRvZGFidHJhbSwgdHRlc3Rfc2ltc19zaWcgPSBzdW0odHRlc3RfcHZhbF9jb2NsMnRvZGFidHJhbSA8PSAwLjA1KSksCiAgY29jbDJ0b2NvY2wyIDwtIGRhdGEuZnJhbWUoIk1lYW5fWnNjb3JlIiA9IHpfbWVhbl9jb2NsMnRvY29jbDIsICJNZWFuX3B2YWwiID0gcHZhbF9tZWFuX2NvY2wydG9jb2NsMiwgIldlaWdodGVkX01lYW5fWnNjb3JlIiA9IHpfd21lYW5fY29jbDJ0b2NvY2wyLCAiV2VpZ2h0ZWRfTWVhbl9wdmFsIiA9IHB2YWxfd21lYW5fY29jbDJ0b2NvY2wyLCB0dGVzdF9zaW1zX3NpZyA9IHN1bSh0dGVzdF9wdmFsX2NvY2wydG9jb2NsMiA8PSAwLjA1KSksCiAgY29jbDJ0b2NpcyA8LSBkYXRhLmZyYW1lKCJNZWFuX1pzY29yZSIgPSB6X21lYW5fY29jbDJ0b2NpcywgIk1lYW5fcHZhbCIgPSBwdmFsX21lYW5fY29jbDJ0b2NpcywgIldlaWdodGVkX01lYW5fWnNjb3JlIiA9IHpfd21lYW5fY29jbDJ0b2NpcywgIldlaWdodGVkX01lYW5fcHZhbCIgPSBwdmFsX3dtZWFuX2NvY2wydG9jaXMsIHR0ZXN0X3NpbXNfc2lnID0gc3VtKHR0ZXN0X3B2YWxfY29jbDJ0b2NpcyA8PSAwLjA1KSkKKQoKcm93bmFtZXMoc2ltX3Jlc3VsdHMpIDwtIGMoImRhYnRyYW0iLCAiZGFidHJhbXRvZGFidHJhbSIsICJkYWJ0cmFtdG9jb2NsMiIsICJkYWJ0cmFtdG9jaXMiLCAiY2lzIiwgImNpc3RvZGFidHJhbSIsICJjaXN0b2NvY2wyIiwgImNpc3RvY2lzIiwgImNvY2wyIiwgImNvY2wydG9kYWJ0cmFtIiwgImNvY2wydG9jb2NsMiIsICJjb2NsMnRvY2lzIikKCndyaXRlLmNzdihzaW1fcmVzdWx0cywgJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9zaW1fcmVzdWx0cy5jc3YnLCByb3cubmFtZXMgPSBUKSAKYGBgCgo=